2014-11-18 2 views
-1

Я использую OpenGl 3 и учебник от BennyBox на Youtube.Создание шейдеров Opengl

Используя этот метод:

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. 

У меня есть точные s ame в качестве видео, и он отлично работает с использованием основного колорирующего шейдера. Я на Visual Studio 2012.

ответ

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; 
} 
+0

Alright, что сделал это на самом деле. Я понял, что у меня также была опечатка для sample2D, которая должна быть sampler2d.Я думаю, я не тщательно следил за учебником ... Спасибо за вашу помощь. – Everts

+0

Нет проблем. Рад помочь. –

Смежные вопросы