2012-09-23 46 views
3

之前我張貼一些代碼,我將解釋:我在iPhone平臺上學習的OpenGL ES 2.0,現在,我有我的程序編譯每一次,但它只能運行一些正確的時間。這是一個超級簡單的程序,帶有頂點着色器和片段着色器以及單個三角形。glBindAttribLocation()的某些名稱不起作用。 Objective-C問題?

出於某種原因,在頂點着色器的工作只有特定的屬性名稱。舉例來說,如果我用attribute vec4 v_Color在程序運行得很好,但如果我使用attribute vec4 v_color沒有大寫「C」,將它重新分配我的位置屬性是我的顏色屬性,反之亦然,即使我明確地做出glBindAttribLocation()名稱參數匹配與屬性名稱完全匹配爲。另一個不起作用的是vColor,但由於某種原因a_color工作得很好。我嘗試使用一些隨機詞,如「酒吧」,並沒有奏效。請記住,我將頂點着色器中的名稱與我在glBindAttribLocation()中指定的名稱進行匹配。

這似乎不大可能,只有特定的名稱應該工作。 (是不是通用屬性的整點給予了程序員更多的靈活性?)假設所有我做的是改變了名字,我不知道是否有什麼東西靠不住與我讀的頂點着色器到我的程序的方式第一名;也許我使用了錯誤的編碼類型。也許它會誤讀它,並試圖自行解決它,因此忽略了我擁有它的明確名稱並重新分配它們。

下面是我使用閱讀頂點着色器的代碼:

NSError *error; 
NSString *vertPath = [[NSBundle mainBundle] pathForResource:@"Simple" ofType:@"vert"]; 
NSString *vertShaderString = [NSString stringWithContentsOfFile:vertPath encoding:NSUTF8StringEncoding error:&error]; 
const GLchar *vertShaderText = [vertShaderString UTF8String]; 

if (!vertShaderString) { 
    NSLog(@"%@", [error localizedDescription]); 
} 

vertShader = glCreateShader(GL_VERTEX_SHADER); 
glShaderSource(vertShader, 1, &vertShaderText, NULL); 

glCompileShader(vertShader); 
glGetShaderiv(vertShader, GL_COMPILE_STATUS, &vertCompiled); 
if (!vertCompiled) { 

    NSLog(@"Vert shader not compiled."); 
} 

glAttachShader(prog, vertShader); 

然後我實際使用,使我的繪圖調用代碼:

GLfloat vertices[] = { 0.0, 0.0, 0.0, 0.5, 0.5, 0.5 }; 
GLubyte indices[3] = { 0, 1, 2 }; 

// Position vertex attribute data 
glEnableVertexAttribArray(0); 
glBindAttribLocation(prog, 0, "a_position"); 
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, vertices); 


// Color vertex attribute data 
GLfloat vColors[] = { 
    1.0, 0.0, 0.0, 1.0, 
    0.0, 1.0, 0.0, 1.0, 
    0.0, 0.0, 1.0, 1.0 }; 

glEnableVertexAttribArray(1); 
glBindAttribLocation(prog, 1, "a_color"); 
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, vColors); 


glDrawElements(GL_TRIANGLES, sizeof(indices)/sizeof(GLubyte), GL_UNSIGNED_BYTE, indices); 

最後,相當瑣碎頂點着色器(無需包含碎片着色器,因爲它非常基本):

attribute vec4 a_position; 
attribute vec4 a_color; 

varying vec4 varColor; 

void main() { 

gl_Position = a_position; 
varColor = a_color; 
} 

上面的代碼執行盟友工作得很好,但如果我要將a_color更改爲v_color,它會突然切換我的位置數據和我的顏色數據,所以我的三角形變形並且顏色都是錯誤的,這當然是不可取的。這是一個非常奇怪的問題。你懷疑這是我的Objective-C實現還是我的OpenGL ES 2.0實現的問題?

謝謝你的時間!

回答

4

調用glBindAttribLocation僅在下一次程序鏈接到glLinkProgram時生效。像這樣調用它什麼都不做,因此你的變量被分配給編譯器提供的任何隨機數。

另一種選擇是,如果您不想在鏈接之前調用它,則可以使用此處的glGetAttribLocation來查詢OpenGL爲每個屬性分配的值。儘管試圖緩存這個值,這樣你就不會在每一幀都調用get

+0

精彩,感謝您的回答添!就像你說的那樣。顯然,我必須重新排列我的代碼才能正常工作。我重新閱讀了編程手冊的相關部分,解釋了爲什麼這種鏈接會發生。現在有道理。 (對不起,我沒有早點回復,我在學校,幾乎忘記了這件事,直到我回來重新回到編程問題時休息。) – Mike

+0

精彩的回答,順利和乾淨。特此+1。 – Netherwire