2012-06-28 19 views
0

此代碼僅呈現一個十二面體和完全忽略了glBegin(GL_TRIANGLES)塊:GLSL和在glBegin(GL_TRIANGLES)不工作

glutSolidDodecahedron(); 
glBegin(GL_TRIANGLES); 
glNormal3f(1, 0, 0); 
glVertex3f(11, 0, 0); 
glNormal3f(0, 1, 1); 
glVertex3f(-11, 0, 0); 
glNormal3f(0, 0, 1); 
glVertex3f(0, 0, 11); 
glEnd(); 

兩個着色器是相當簡單:

頂點着色器:

varying vec3 normal; 
void main() 
{ 
gl_Position = ftransform(); 
gl_FrontColor = gl_Color; 
gl_BackColor = gl_Color; 
normal = gl_Normal; 
normal = gl_NormalMatrix * normal; 
} 

and the frag:

uniform vec3 lightDir; 
varying vec3 normal; 
void main() 
{ 
    float intensity = dot(lightDir, normal); 
    gl_FragColor = 0.5 * (1.5 + intensity) * gl_Color; 
} 

儘管glutSolidX函數的類型適用於這個例子(基於Lightouse3D教程),如何快速繪製三角形,從一幀到另一幀改變座標(我嘗試過使用數組和GL_DYNAMIC_DRAW,但與舊的相比工作太多了「固定管道」方法)。我看到其他人仍然成功地使用GLSL着色器的glBegin(..); glEnd();塊,所以它必須是可能的。有什麼可能會丟失?

+0

你有什麼錯誤?你有沒有嘗試從片段着色器輸出純色? –

+0

你確定它完全忽略了只在渲染視錐體或背面剔除三角形之外渲染它的'glBegin/glEnd'塊?前者會非常奇怪(或實際上不可能),因爲'glutSolid ...'也不過是一個簡單的'glBegin/glEnd'塊。 –

+0

@AndreasBrinck着色器正在編譯和鏈接,沒有任何錯誤。設置純色可以工作,但會忽略片段中的僞照明計算。 – teodron

回答

5

在在glBegin/glEnd塊中的三角形的頂點的座標是

11, 0, 0 
-11, 0, 0 
    0, 0, 11 

,這意味着它在視圖中完全位於平坦的。這就像從一個硬角度看一張紙,它變成了一條線。由於三角形沒有厚度,所以即使畫出這條線也看不到三角形。

+0

好的,這可能是,謝謝..我會檢查我所有的座標,如果這是所有「邪惡」的來源,我也會接受答案。非常感謝您的觀察.. +1 – teodron

+1

也可能是,三角形背對着視野,背面被剔除(如問題評論中提到的那樣)。在這種情況下,頂點被提交的順序必須顛倒過來,以便將三角形翻轉到正確的方向。 – risingDarkness

+0

那麼它回答了我的第一個問題:可以這樣渲染三角形。事實上,我的正常計算的三角形沒有得到渲染,不管方向是另一個調查點。良好的工作發現了這個三角幾乎「退化」的情況。 – teodron