2012-07-20 95 views
1

我想要建立一個簡單的直通幾何着色器,但 我不能使它與直通幾何着色器

glDrawElements(GL_TRIANGLES, fooSize, GL_UNSIGNED_INT, NULL); 

工作,但它確實與

glDrawArrays(GL_TRIANGLES, 0, foo_INDEX);. 

幾何着色器的工作是..

#version 400 
#extension GL_EXT_geometry_shader4 : enable 

layout(triangles) in; 
layout(triangle_strip, max_vertices = 3) out; 

void main() { 
    for(int i = 0; i < gl_VerticesIn; i++) { 
    gl_Position = gl_PositionIn[i]; 
    EmitVertex(); 
    } 
    EndPrimitive(); 
} 

所以,有人有一個y想法爲什麼這個幾何着色器與drawArrays一起工作,並且不能和drawElements一起工作?請。

+1

如果沒有一些關於它的*「無效」的想法,你的問題就沒有意義了。 – 2012-07-20 18:46:36

回答

9

你已經寫了一個非常混亂和混亂的幾何着色器。

您的第一行表示您正在使用GLSL 4.00版。該語言具有幾何着色器作爲核心功能;不需要擴展。您的第二行然後啓用EXT_geometry_shader4 分機

問題出在核心幾何着色器和EXT_geometry_shader4是非常不同的東西

例如,核心幾何着色器中沒有gl_VerticesIn。您獲得的頂點數由您的layout() in;語句定義。您使用了triangles,因此答案爲3.您還可以使用gl_in.length()找到它,其中gl_in是包含默認頂點輸入值的接口塊數組。同樣,gl_PositionIn在覈心幾何着色器中不存在;你使用gl_in[index].gl_Position

所以,你的幾何着色器的代碼似乎是專爲EXT_geometry_shader4 ...除了這些行:

layout(triangles) in; 
layout(triangle_strip, max_vertices = 3) out; 

這些都是純粹的核心幾何着色器;在EXT_geometry_shader4中,這些參數在鏈接時在OpenGL代碼中指定,而不在着色器本身中指定。

所以,你已經徹底搞混了編譯器,其中一半使用EXT版本,一半使用核心版本。

的你正在試圖做的是什麼這樣一個適當的核心版本:

#version 400 

layout(triangles) in; 
layout(triangle_strip, max_vertices = 3) out; 

void main() { 
    for(int i = 0; i < 3; i++) { // You used triangles, so it's always 3 
    gl_Position = gl_in[i].gl_Position; 
    EmitVertex(); 
    } 
    EndPrimitive(); 
} 

我不知道這是否會解決您的問題,但這些都是問題與着色器。

+0

謝謝。 (我很喜歡幾何着色器。)現在我只使用純粹的核心語法, 但我的問題依然存在。 它與** glDrawArray **一起工作正常,並且**不能**與** glDrawElements一起工作**它返回「無效操作」,就好像着色器模式與繪製模式不兼容(都是三角形)=/ – 2012-07-23 12:53:46

+1

@ LennaMaule你確定它確實是由着色引起的。你沒有使用幾何着色器來嘗試嗎? – 2012-07-23 14:38:40