2011-02-14 134 views
8

我無法弄清楚,如何獲得與OpenGL ES 2.0相似的OpenGL ES 1.1結果。我想實際使用Sampler2D(將我的紋理與Alpha通道融合到Framebuffer)並設置Color。質地應在顏色畫 - 在OpenGL ES像1.1 我FragmentShader看起來是這樣的:GLSL中的紋理和顏色?

varying lowp vec4 colorVarying; 
varying mediump vec2 texcoordVarying; 
uniform sampler2D texture; 

void main(){ 
    gl_FragColor = texture2D(texture, texcoordVarying) + colorVarying; 
} 

但部分「+ colorVarying」破壞了我的alpha通道,黑色(因爲我也加colorVarying,如果AlphaValue是0),並使一個奇怪的漸變效果...紋理&色彩通道結合在固定的功能管道?我對glColor4f更換:

void gl2Color4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a){ 
    const GLfloat pointer[] = {r, g, b, a}; 
    glVertexAttribPointer(ATTRIB_COLOR, 2, GL_FLOAT, 0, 0, pointer); 
    glEnableVertexAttribArray(ATTRIB_COLOR); 
} 

而且我使用glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);如果這是某種相關...

對於彩色1.0,0.0,1.0,1.0這裏是我現在得到: Now

而且我想:

What I want to see

一些想法來完成這個? 任何幫助,將不勝感激。

回答

15

當您質地結合您的頂點顏色的方式的OpenGL ES 1.1的默認操作,你會希望你的片段着色器是:

varying lowp vec4 colorVarying; 
varying mediump vec2 texcoordVarying; 
uniform sampler2D texture; 

void main(){ 
    gl_FragColor = texture2D(texture, texcoordVarying) * colorVarying; 
} 

注意GL_MODULATE由顏色乘以紋理,而不是添加到它。

由於在OpenGL ES(1.1和2.0)中傳遞0到頂點數組規範函數的跨度不會導致0的跨度,所以您會看到圖像中的漸變,而OpenGL ES會計算跨度對你來說,假設你指定的格式/類型是緊密排列的元素。因此,您實際上正在將數組的末尾讀取到隨機存儲器中。如果你想在所有的頂點相同的值,你應該設置當前屬性值,並禁止相關的陣列:

void gl2Color4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a){ 
    const GLfloat pointer[] = {r, g, b, a}; 
    glVertexAttrib4fv(ATTRIB_COLOR, pointer); 
    glDisableVertexAttribArray(ATTRIB_COLOR); 
} 
+0

謝謝!這對我來說非常有效。 – Constantin 2011-02-15 10:22:16

0

支點的答案是我偉大的工作。我只是想補充一下GLSL(3.3+)的更新版本:

in vec2 passedUvCoords; 
in vec4 passedColor; 

out vec4 outColor; 

uniform sampler2D textureSampler; 

void main(void) { 
    outColor = texture(textureSampler, passedUvCoords) * passedColor; 
} 

這只是片段着色器。