着色器创建Opengl

时间:2014-11-18 10:00:19

标签: opengl shader

我在Youtube上使用OpenGl 3和BennyBox的教程。

使用此方法:

static void CheckShaderError(GLuint shader, GLuint flag, bool isProgram, const std::string& errorMessage){
    GLint success = 0;
    GLchar error [1024] = {0};

    if(isProgram){
        glGetProgramiv(shader, flag, &success);
    }else{
        glGetShaderiv(shader, flag, &success);
    }
    if(success == GL_FALSE){
        if(isProgram){
            glGetProgramInfoLog(shader, sizeof(error), NULL, error);
        }else{
            glGetShaderInfoLog(shader,sizeof(error), NULL, error);
        }
        std::cerr<< errorMessage<< ": " << error<< "'"<<std::endl; 
    }
} 

我应该能够加载着色器文件(片段和顶点着色器)。它适用于基本着色器,但是当我尝试将它们修改为该点时:

#version 120

attribute vec3 position;
attribute vec2 texCoord;

varying vec2 texCoord;

void main(){
    gl_Position = vec4(position, 1.0);
    texCoord0 = texCoord;
}

我得到:

Error compiling shader!: 'ERROR: 0:6: 'texCoord' : redefinition
ERROR: 0:11: 'texCoord0' : undeclared identifier
ERROR: 0:11: 'assign' :  cannot convert from 'attribute 2-component vector of float' to 'float'

和片段着色器:

#version 120

uniform sampler2D diffuse;
varying vec2 texCoord0;

void main(){ 
    gl_FragColor = texture2D(diffuse, texCoord0);
}

给出:

Unable to load shader: ./res/basicShader.fs
Error linking shader program: 'Attached vertex shader is not compiled.

我有与视频完全相同的代码,使用基本着色着色器可以正常运行。我在Visual Studio 2012上。

1 个答案:

答案 0 :(得分:7)

您的顶点着色器中有两个错误。

首先,您要两次声明texCoord。

attribute vec2 texCoord;
varying vec2 texCoord;

然后你试图使用一个名为texCoord0的变量,而不是声明它。

texCoord0 = texCoord;

您的顶点着色器应如下所示:

#version 120

attribute vec3 position;
attribute vec2 texCoord;

varying vec2 texCoord0;

void main(){

    gl_Position = vec4(position, 1.0);
    texCoord0 = texCoord;
}