2014-04-21 138 views
0

我想知道如何使用多個對象相同的着色器,但讓他們的對象有不同的顏色的OpenGL 2.0渲染多個對象以相同的着色器

我在屏幕上有很多的立方體,所有當前的負載相同的着色器,唯一的區別是當它被繪製時,我改變了立方體的顏色。如果我爲它們設置了相同的_program,它們就變成了完全相同的顏色。

- (void)draw:(float)eyeOffset 
{ 
    // Calculate the per-eye model view matrix: 
    GLKMatrix4 temp = GLKMatrix4MakeTranslation(eyeOffset, 0.0f, 0.0f); 
    GLKMatrix4 eyeBaseModelViewMatrix = GLKMatrix4Multiply(temp, self.baseModelViewMatrix); 

    if (self.isTransparant) 
    { 
     glEnable (GL_BLEND); 
     glDisable(GL_CULL_FACE); 
     //glDisable(GL_DEPTH_TEST); 
     glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    } 

    if (self.textureInfo) 
    { 
     glBindTexture(self.textureInfo.target, self.textureInfo.name); 
    } 

    glBindVertexArrayOES(_vertexArray); 

//See if we are sharing a program shader 
    if (self.tprogram) 
    { 
     glUseProgram(self.tprogram); 
    } 
    else 
    { 
     glUseProgram(_program); 
    } 

    self.modelViewMatrix = GLKMatrix4MakeTranslation(self.position.x,self.position.y, self.position.z);//(float)x, (float)y, -1.5f) 
    self.modelViewMatrix = GLKMatrix4Scale(self.modelViewMatrix, self.scale.x, self.scale.y, self.scale.z); 

    //rotation +=0.01; 
    self.modelViewMatrix = GLKMatrix4Rotate(self.modelViewMatrix,self.spinRotation, 0.0 ,0.0 ,1.0); 

    self.modelViewMatrix = GLKMatrix4Multiply(eyeBaseModelViewMatrix, self.modelViewMatrix); 

    GLKMatrix3 normalMatrix = GLKMatrix3InvertAndTranspose(GLKMatrix4GetMatrix3(self.modelViewMatrix), NULL); 
    GLKMatrix4 modelViewProjectionMatrix = GLKMatrix4Multiply(self.projectionMatrix, self.modelViewMatrix); 

    glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, modelViewProjectionMatrix.m); 
    glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, normalMatrix.m); 

    _colorSlot = glGetUniformLocation(_program, "color"); 
    GLfloat color[] = { 
     self.color.x, self.color.y, self.color.z, self.color.a}; 
    glUniform4fv(_colorSlot, 1, color); 

    glDrawArrays(GL_TRIANGLES, 0, 36); 

    if (self.isTransparant) 
    { 
     glEnable(GL_CULL_FACE); 
     //glEnable(GL_DEPTH_TEST); 
     glDisable(GL_BLEND); 
    } 
} 

//設定每個立方體

- (void)setup; 
{ 

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

    glGenBuffers(1, &_vertexBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData), gCubeVertexData, GL_STATIC_DRAW); 

    glEnableVertexAttribArray(GLKVertexAttribPosition); 
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 32, BUFFER_OFFSET(0)); 
    glEnableVertexAttribArray(GLKVertexAttribNormal); 
    glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 32, BUFFER_OFFSET(12)); 
    glEnableVertexAttribArray(GLKVertexAttribTexCoord0); 
    glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 32, BUFFER_OFFSET(24)); 

    glBindVertexArrayOES(0); 

} 

着色

attribute vec4 position; 
attribute vec3 normal; 
uniform vec4 color; 

varying lowp vec4 colorVarying; 

uniform mat4 modelViewProjectionMatrix; 
uniform mat3 normalMatrix; 

void main() 
{ 
    //vec4 diffuseColor = color; 

    vec3 eyeNormal = normalize(normalMatrix * normal); 
    vec3 lightPosition = vec3(0.0, 0.0, 1.0); 
    //diffuseColor = vec4(0.4, 0.4, 1.0, 1.0); 

    float nDotVP = max(0.7, dot(eyeNormal, normalize(lightPosition))); // 0.0 

    colorVarying = color * nDotVP; 

    gl_Position = modelViewProjectionMatrix * position; 
} 

我認爲均勻vec4顏色;允許我隨時更改顏色,如果每個對象都有着色器,它可以正常工作,我可以在飛行中更改對象顏色

+0

我正在繪圖函數中運行該代碼,所以它應該更新。 – Burf2000

回答

2

如何爲每個多維數據集發送一個不同的統一數據(例如uniform vec4 cubeColor並在片段中使用它着色器)在調用glDrawArrays()之前呢?或者,您可以考慮在設置過程中爲每個立方體上傳頂點和頂點顏色,然後在繪製時綁定合適的頂點緩衝區(例如attribute vec3 a_vertex)和頂點顏色緩衝區(例如,您分配的attribute vec4 a_vertexColor)在你的頂點着色器中,到varying vec4 v_vertexColor,並在你的片段着色器中用作varying vec4 v_vertexColor)。

此外,作爲一個側面說明,如果你打算使用同樣的程序,你可以調用glUseProgram()一次,在安裝過程中(OpenGL的是基於狀態機,就意味着它回憶一定參數(如狀態,如當前程序),只要您不更改它們即可)。這可能會提高你的程序的性能一點點;-)

祝你好運。

+1

如果顏色與整個圖元的顏色相同,則「屬性」方法的變體通常應該更有效。使用諸如'glVertexAttrib4f'之類的調用,而不是將顏色添加到頂點緩衝區,而是在繪製調用之前設置color屬性的值。 –

+0

我添加了實際的繪圖代碼,所以你得到一個更好的主意 – Burf2000

+0

我找不到一個iOS的例子glVertexAttrib4f – Burf2000