2011-02-14 20 views
8

No puedo entender cómo obtener OpenGL ES 2.0 de manera similar Resultados para OpenGL ES 1.1. Quiero usar realmente un Sampler2D (para combinar mi textura con Alpha Channel con el Framebuffer) y también establecer un Color. La textura debe ser pintado en el color - como en OpenGL ES 1.1 Mi FragmentShader se ve así:¿Textura y color juntos en GLSL?

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

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

Pero la parte "+ colorVarying" destruye mi alphachannel con negro (porque añado también colorVarying, si el AlphaValue es 0) y produce un extraño efecto de degradado ... ¿Cómo se combina el canal de color de textura & en la tubería de función fija? Mi reemplazo para glColor4f es:

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); 
} 

y estoy usando glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); si esto es de alguna manera relevante ...

Para el color 1.0, 0.0, 1.0, 1.0 aquí es lo que me pasa ahora: Now

Y quiero llegar:

What I want to see

Algunas ideas para lograr esto? Cualquier ayuda sería apreciada.

Respuesta

15

Para combinar el color de vértice con la textura de la forma en OpenGL ES 1.1 hace por defecto, usted quiere que su fragment shader sea:

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

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

Tenga en cuenta que GL_MODULATE multiplica la textura por el color, en lugar de añadiéndole

Está viendo un degradado en su imagen porque pasar un paso de 0 a las funciones de especificación de matriz de vértices en OpenGL ES (tanto 1.1 como 2.0) no da como resultado 0, sino que OpenGL ES calcula la zancada para usted, suponiendo que los elementos del formato/tipo que ha especificado estén empaquetados de manera compacta. Como resultado, en realidad está leyendo más allá del final de su matriz en memoria aleatoria. Si desea que el mismo valor en todos los vértices, debe establecer el valor del atributo actual y desactivar la matriz asociada:

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

¡Gracias! Eso funciona muy bien para mí. – Constantin

0

Pivotes respuesta es trabajar muy bien para mí. Yo sólo quería añadir cómo se vería con una versión más reciente de GLSL (3.3+):

in vec2 passedUvCoords; 
in vec4 passedColor; 

out vec4 outColor; 

uniform sampler2D textureSampler; 

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

Esto es sólo el fragmento de sombreado.