2015-03-03 109 views
-1

我目前正在构建一个顶点着色器来在三维模型上围绕z轴执行非常简单的旋转。 3D模型原本颜色很好。但是当我添加我写的着色器后,它将原始颜色搞乱了。我不知道为什么,因为我认为顶点着色器不应该触摸颜色部分。顶点着色器和原始模型的颜色

我想要的只是转换顶点,并在同一时间,颜色保持原来的。

着色器是在这里,我将其命名为“shader.cpp”:

void main() { 
    float PI = 3.14159265358979323846264; 
    float angle = 45.0; 
    float rad_angle = angle*PI/180.0; 

    vec4 a = gl_Vertex; 
    vec4 b = a; 
    b.x = a.x*cos(rad_angle) - a.y*sin(rad_angle); 
    b.y = a.y*cos(rad_angle) + a.x*sin(rad_angle); 
    gl_Position = gl_ModelViewProjectionMatrix*b; 
} 

其实,这只是一个很简单的着色器从OpenGL的GLSL的官方网站复制。

我用以下代码加载着色器,注意readShader(const char *)是一种读取文件shader.cpp内容的方法。这是非常微不足道的,所以我不把它放在这里(很肯定的,它工作正常):

void shading() { 

    GLuint shader, prog; 
    const GLchar * shaderText = readShader("shader.cpp"); 
    shader = glCreateShader(GL_VERTEX_SHADER); 
    glShaderSource(shader, 1, &shaderText, NULL); 
    glCompileShader(shader); 

    prog = glCreateProgram(); 
    glAttachShader(prog, shader); 
    glLinkProgram(prog); 
    glUseProgram(prog); 
} 

然后,有原代码显示()函数,它建立了3D图形。然后在display()的前面添加shading()函数。就像这样:

void display(void) { 
    shading(); 
    //.... 
} 

当然的显示功能是由过剩的lib函数称为:

glutDisplayFunc(display); 
+0

与您的问题无关,但为什么当它不是C++源文件时称为shader.cpp? – immibis 2015-03-03 07:30:42

+0

另外,您正在使用哪种OpenGL版本? – immibis 2015-03-03 07:31:11

+0

我认为你必须通过如下方式将颜色信息从VS传递到FS:'gl_FrontColor = gl_Color;'(在VS中) – 2015-03-03 07:44:30

回答

1

您本身不能有一个顶点着色器。当使用可编程流水线时,您需要同时拥有一个顶点着色器和一个片段着色器。

从第3.9节“片段着色器”在OpenGL的3.3规格:

在使用时当前程序对象包括片段着色器,其片段着色器被认为是活性的,并且是用来处理片段。如果程序对象没有片段着色器,或者当前没有使用程序对象,则片段着色器执行的结果是不确定的。

这意味着您将不得不添加片段着色器,以便您可以使用顶点着色器。

+0

对,我为它写了一个片段着色器,但是我仍然无法得到我想要的。那么,情况就是这样,模型的颜色是在OpenGL代码中定义的。我只是想用GLSL做一些像旋转一样的变换。但是当我应用着色器时,它将原来定义的颜色搞乱了。这是不正常的吗? – Cherish 2015-03-04 22:16:03