运行时错误为0(9) : error C1035: assignment of incompatible types
我在Linux Mint 17.2 64位上使用NVIDIA GeForce GT 740和355.06驱动程序,内核4.1.5
创建错误的片段着色器如下:
#version 330 core
in vec4 tColor;
in vec2 UV;
out vec4 color;
uniform sampler2D tex;
vec4 color_tmp;
void main(){
color_tmp.r = (1 - tColor.a) * texture(tex, UV).r;
color_tmp.g = (1 - tColor.a) * texture(tex, UV).g;
color_tmp.b = (1 - tColor.a) * texture(tex, UV).b;
color_tmp.r += tColor.r * tColor.a;
color_tmp.g += tColor.g * tColor.a;
color_tmp.b += tColor.b * tColor.a;
color.r = color_tmp.r;
color.g = color_tmp.g;
color.b = color_tmp.b;
}
我尝试使用.rgb代替.r / .g / .b,直接写入颜色(不使用color_tmp),并使用vec3进行颜色
以下错误也出现同样的错误:
#version 330 core
in vec2 UV;
out vec4 color;
uniform sampler2D texSampler;
void main(){
color = texture(texSampler, UV);
}
这些着色器基于http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-11-2d-text/
编译着色器的功能如下:
GLuint createShaderProgram(const GLchar* vertexShader, const GLchar* fragmentShader, bool* result){
GLuint vShader = glCreateShader(GL_VERTEX_SHADER);
GLuint fShader = glCreateShader(GL_FRAGMENT_SHADER);
int vl = strlen(vertexShader);
int fl = strlen(fragmentShader);
glShaderSource(vShader, 1, (const GLchar**)&vertexShader, &vl);
glShaderSource(fShader, 1, (const GLchar**)&fragmentShader, &fl);
GLint Result;
glCompileShader(vShader);
glGetShaderiv(vShader, GL_COMPILE_STATUS, &Result);
if (Result != GL_TRUE){
char* InfoLog = malloc(8192);
int length;
glGetShaderInfoLog(vShader, 8192, &length, InfoLog);
fprintf(stderr, "Vertex shader compilation failed. Info log is present below:\n%s", InfoLog);
fflush(stderr);
free(InfoLog);
*result = false;
glDeleteShader(vShader);
glDeleteShader(fShader);
return 0;
}
glCompileShader(fShader);
glGetShaderiv(fShader, GL_COMPILE_STATUS, &Result);
if (Result != GL_TRUE){
char* InfoLog = malloc(8192);
int length;
glGetShaderInfoLog(fShader, 8192, &length, InfoLog);
fprintf(stderr, "Fragment shader compilation failed. Info log is present below:\n%s", InfoLog);
fflush(stderr);
free(InfoLog);
*result = false;
glDeleteShader(vShader);
glDeleteShader(fShader);
return 0;
}
GLuint shaderProgram = glCreateProgram();;
glAttachShader(shaderProgram, vShader);
glAttachShader(shaderProgram, fShader);
glLinkProgram(shaderProgram);
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &Result);
if (Result != GL_TRUE){
char* InfoLog = malloc(8192);
int length;
glGetProgramInfoLog(shaderProgram, 8192, &length, InfoLog);
fprintf(stderr, "Shader link failed. Info log is present below:\n%s", InfoLog);
fflush(stderr);
free(InfoLog);
*result = false;
glDeleteShader(vShader);
glDeleteShader(fShader);
glDeleteProgram(shaderProgram);
return 0;
}
glDeleteShader(vShader);
glDeleteShader(fShader);
*result = true;
return shaderProgram;
}