2012-12-15 47 views
0

我是OpenGL ES中的新手,我正在嘗試做一些基本的東西,作爲學習曲線的一部分。我能夠使用兩個glDrawArrays調用呈現兩個網格,一個球體和一個立方體。我試圖加載一個不同的紋理來環繞立方體和球體,但是發生的情況是最後一個加載的紋理被包裝到兩個網格中。有誰知道爲什麼會發生這種情況?如何在OpenGL ES 2.0中爲每個網格加載不同的紋理?

這裏是爲網格的代碼:

glEnable(GL_DEPTH_TEST); 

glGenVertexArraysOES(1, &vertexArray); 
glBindVertexArrayOES(vertexArray); 

glGenBuffers(1, &vertexBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeMeshVerts, meshVerts, GL_STATIC_DRAW); 

glEnableVertexAttribArray(GLKVertexAttribPosition); 
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 4*8, BUFFER_OFFSET(0)); 

glEnableVertexAttribArray(GLKVertexAttribNormal); 
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 4*8, BUFFER_OFFSET(4*3)); 

glEnableVertexAttribArray(GLKVertexAttribTexCoord0); 
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 4*8, BUFFER_OFFSET(4*6)); 

// Texture 
// Create image from file 
NSString *path = [[NSBundle mainBundle] pathForResource:textureImage ofType:@"jpg"]; 
NSData *texData = [[NSData alloc] initWithContentsOfFile:path]; 
UIImage *image = [[UIImage alloc] initWithData:texData]; 

//生成一個新的OpenGL ES紋理緩衝器和 //從 初始化使用像素數據緩衝區內容//指定核心圖形圖像,cgImage 。

[TextureLoader textureWithCGImage:image.CGImage options:nil error:NULL]; 

glBindVertexArrayOES(0); 

這裏是抽獎代碼:

glBindVertexArrayOES(_vertexArray); 

// Render the object with ES2 
glUseProgram(_program); 

// Set the sampler texture unit to 0 
glUniform1i (uniforms[UNIFORM_TEXTURE_MATRIX], 0); 

glDrawArrays(GL_TRIANGLES, 0, numVertices); 

回答

1

你是不是在渲染之前結合的紋理採樣器。首先,您需要保留對textureWithCGImage:返回的GLKTextureInfo對象的引用,然後可以使用具有紋理名稱的glBindTexture將其綁定到當前的樣板。例如

GLKTextureInfo *tex = [TextureLoader textureWithCGImage:image.CGImage options:nil error:NULL]; 
... 
glBindTexture(GL_TEXTURE_2D, tex.name); 

您需要在每次繪製調用之前設置正確的紋理到採樣器。你可以將你需要的每個紋理綁定到不同的採樣器,然後傳遞正確的採樣器制服。

+0

太棒了!這工作!非常感謝 – Pupillam