2012-11-12 27 views
0

我創建了一個基本着色器程序來刷新我的openGL GLSL。OpenGL着色器程序奇怪的結果

CPU側

我已經正確創建我的着色器程序.vp和.fp鏈接正確和錯誤校驗

我的結果,當我渲染始終是一個黑色的三角

之前,我聯繫我的計劃,但之後,我附上兩個着色器我這樣做

glBindAttribLocation(program, 0, "vVertexPos"); 
glBindAttribLocation(program, 1, "vColor"); 

我的兩個位置變量和我的顏色可變的着色器

所有日。是剛剛通過這樣的IM一個快速運行並不擔心除了openGL的醜陋的代碼調用和着色器設置

struct PosColVertex 
{ 
    float pos[3]; 
    float color[4]; 
}; 

PosColVertex verts[3]; 
float vPos1[3] = { 0.5f, 0.0f, -1.0f }; 
float vPos2[3] = { 0.0f, 1.0f, -1.0f }; 
float vPos3[3] = { -0.5f, 0.0f, -1.0f }; 
memcpy(verts[0].pos, vPos1, sizeof(float)*3); 
memcpy(verts[1].pos, vPos2, sizeof(float)*3); 
memcpy(verts[2].pos, vPos3, sizeof(float)*3); 

float vColor1[4] = { 1.0f, 0.0f, 0.0f, 1.0f }; 
float vColor2[4] = { 0.0f, 1.0f, 0.0f, 1.0f }; 
float vColor3[4] = { 0.0f, 0.0f, 1.0f, 1.0f }; 
memcpy(verts[0].color, vColor1, sizeof(float)*4); 
memcpy(verts[1].color, vColor2, sizeof(float)*4); 
memcpy(verts[2].color, vColor3, sizeof(float)*4); 

glGenBuffers(1, &vboHandle); 
glBindBuffer(GL_ARRAY_BUFFER, vboHandle); 
glBufferData(GL_ARRAY_BUFFER, sizeof(PosColVertex)*3, verts, GL_DYNAMIC_READ); 

我的渲​​染,這是我做什麼

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

//use our shader program 
glUseProgram(program); 

//set which vertices we will be using 
glBindBuffer(GL_ARRAY_BUFFER, vboHandle); 

glEnableVertexAttribArray(0); 
glEnableVertexAttribArray(1); 

//specify our vertex attribute 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(PosColVertex), (void*)(0)); 

//specify our texture attribute 
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(PosColVertex), (void*)(12)); 

glPushMatrix(); 

//draw our rectangle 
glDrawArrays(GL_TRIANGLES, 0, 3); 

glPopMatrix(); 

glDisableVertexAttribArray(0); 
glDisableVertexAttribArray(1); 

難道我錯了glVertexAttribPointer調用?我檢查了我的着色器的工作原理,它確實改變了這些值,因爲我之前在那裏硬編碼了數值,以便測試它。但即時通訊假設我不告訴openGL在CPU端如何正確閱讀我的垂直。任何幫助?

tri.vp

#version 330 

in vec3 vVertexPos; 

void main(void) 
{ 
    gl_Position = vec4(vVertexPos.x, vVertexPos.y, vVertexPos.z, 1); 
} 

tri.fp

#version 330 

out vec4 vFragColor; 
in vec4 vColor; 

void main(void) 
{ 
    vFragColor = vColor; 
} 
+0

這不是你的問題,但你爲什麼要使用'GL_DYNAMIC_READ'作爲緩衝區對象的用法?你打算將內存讀回CPU嗎?你打算更新內存嗎?如果不是,請使用'GL_STATIC_DRAW'。 –

+0

更重要的是,你的着色器在哪裏? –

+0

我調試了我的着色器它的工作原理:D.但如果你想看到它,我會添加它。我也使用GL_DYNAMIC_READ,因爲我有一個實際的項目im工作,我做這個示例項目只是調試的東西。所以是的,我做計劃搞亂數據那裏我保存它GL_DYNAMIC_READ –

回答

3

您不能訪問屬性片段着色之內,只有內部的vertex shader。這是有道理的,因爲您爲每個頂點指定顏色,而不是爲每個片段指定顏色。所以,我建議你改變你的代碼中的顏色來讀取頂點着色器和它順利輸出到您的片段着色器:

頂點着色器:

in vec3 vVertexPos; 
in vec4 vColor; 

smooth out vec4 fColor; 

void main(void) 
{ 
    gl_Position = vec4(vVertexPos.x, vVertexPos.y, vVertexPos.z, 1); 
    fColor = vColor; 
} 

片段着色器:

smooth in vec4 fColor; 
out vec4 vFragColor; 

void main(void) 
{ 
    vFragColor = fColor; 
} 
+0

我認爲你的第一點是不恰當的,因爲他聲稱使用glBindAttribLocation將屬性放在正確的位置,所以這可能不是問題。儘管你對第二點是正確的。 – Tim

+0

我修復了下半部分,感謝所有的信息:D。它現在=] –

+0

@Tim啊,沒有看到。固定。 – Xymostech