2015-03-03 106 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