Shader: Refine preprocessing on GLES platform
Don't globally set float precision to mediump, only fragment shaders need that and defining it for vertex shaders causes tilemap cracks. Also manually define low precision for variables that hold color / alpha values.
This commit is contained in:
		
							parent
							
								
									a501e4f22f
								
							
						
					
					
						commit
						a53163660f
					
				
					 14 changed files with 67 additions and 42 deletions
				
			
		| 
						 | 
				
			
			@ -28,6 +28,7 @@
 | 
			
		|||
#include <string.h>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
#include "common.h.xxd"
 | 
			
		||||
#include "sprite.frag.xxd"
 | 
			
		||||
#include "hue.frag.xxd"
 | 
			
		||||
#include "trans.frag.xxd"
 | 
			
		||||
| 
						 | 
				
			
			@ -106,32 +107,39 @@ void Shader::unbind()
 | 
			
		|||
	glState.program.set(0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const char *glesHeader = "precision mediump float;\n";
 | 
			
		||||
static const size_t glesHeaderSize = strlen(glesHeader);
 | 
			
		||||
 | 
			
		||||
static void setupShaderSource(GLuint shader,
 | 
			
		||||
                              const unsigned char *src, int srcSize)
 | 
			
		||||
static void setupShaderSource(GLuint shader, GLenum type,
 | 
			
		||||
                              const unsigned char *body, int bodySize)
 | 
			
		||||
{
 | 
			
		||||
	GLuint shaderSrcN;
 | 
			
		||||
	const GLchar *shaderSrc[2];
 | 
			
		||||
	GLint shaderSrcSize[2];
 | 
			
		||||
	static const char glesDefine[] = "#define GLSLES\n";
 | 
			
		||||
	static const char fragDefine[] = "#define FRAGMENT_SHADER\n";
 | 
			
		||||
 | 
			
		||||
	const GLchar *shaderSrc[4];
 | 
			
		||||
	GLint shaderSrcSize[4];
 | 
			
		||||
	size_t i = 0;
 | 
			
		||||
 | 
			
		||||
	if (gl.glsles)
 | 
			
		||||
	{
 | 
			
		||||
		shaderSrcN = 2;
 | 
			
		||||
		shaderSrc[0] = glesHeader;
 | 
			
		||||
		shaderSrc[1] = (const GLchar*) src;
 | 
			
		||||
		shaderSrcSize[0] = glesHeaderSize;
 | 
			
		||||
		shaderSrcSize[1] = srcSize;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		shaderSrcN = 1;
 | 
			
		||||
		shaderSrc[0] = (const GLchar*) src;
 | 
			
		||||
		shaderSrcSize[0] = srcSize;
 | 
			
		||||
		shaderSrc[i] = glesDefine;
 | 
			
		||||
		shaderSrcSize[i] = sizeof(glesDefine)-1;
 | 
			
		||||
		++i;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	gl.ShaderSource(shader, shaderSrcN, shaderSrc, shaderSrcSize);
 | 
			
		||||
	if (type == GL_FRAGMENT_SHADER)
 | 
			
		||||
	{
 | 
			
		||||
		shaderSrc[i] = fragDefine;
 | 
			
		||||
		shaderSrcSize[i] = sizeof(fragDefine)-1;
 | 
			
		||||
		++i;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	shaderSrc[i] = (const GLchar*) shader_common_h;
 | 
			
		||||
	shaderSrcSize[i] = shader_common_h_len;
 | 
			
		||||
	++i;
 | 
			
		||||
 | 
			
		||||
	shaderSrc[i] = (const GLchar*) body;
 | 
			
		||||
	shaderSrcSize[i] = bodySize;
 | 
			
		||||
	++i;
 | 
			
		||||
 | 
			
		||||
	gl.ShaderSource(shader, i, shaderSrc, shaderSrcSize);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Shader::init(const unsigned char *vert, int vertSize,
 | 
			
		||||
| 
						 | 
				
			
			@ -142,7 +150,7 @@ void Shader::init(const unsigned char *vert, int vertSize,
 | 
			
		|||
	GLint success;
 | 
			
		||||
 | 
			
		||||
	/* Compile vertex shader */
 | 
			
		||||
	setupShaderSource(vertShader, vert, vertSize);
 | 
			
		||||
	setupShaderSource(vertShader, GL_VERTEX_SHADER, vert, vertSize);
 | 
			
		||||
	gl.CompileShader(vertShader);
 | 
			
		||||
 | 
			
		||||
	gl.GetShaderiv(vertShader, GL_COMPILE_STATUS, &success);
 | 
			
		||||
| 
						 | 
				
			
			@ -156,7 +164,7 @@ void Shader::init(const unsigned char *vert, int vertSize,
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	/* Compile fragment shader */
 | 
			
		||||
	setupShaderSource(fragShader, frag, fragSize);
 | 
			
		||||
	setupShaderSource(fragShader, GL_FRAGMENT_SHADER, frag, fragSize);
 | 
			
		||||
	gl.CompileShader(fragShader);
 | 
			
		||||
 | 
			
		||||
	gl.GetShaderiv(fragShader, GL_COMPILE_STATUS, &success);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue