为什么我在GLSL中遇到不兼容的类型错误?

时间:2015-08-19 05:50:41

标签: opengl glsl opengl-3

运行时错误为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;
}

0 个答案:

没有答案