2011-02-14 6 views
8

OpenGL ES 2.0에서 OpenGL ES 1.1과 유사한 결과를 얻는 방법을 알아낼 수 없습니다. 사실 Sampler2D (알파 채널과 텍스처를 프레임 버퍼에 혼합)와 Color를 설정하고 싶습니다.GLSL에서 텍스처와 색상을 함께 사용 하시겠습니까?

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

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

그러나 AlphaValue 경우 나는 또한, colorVarying를 추가하기 때문에 일부는 "+ colorVarying는"(검은 색 내 alphachannel을 파괴 : - 텍스처가 색으로 색칠해야한다는 OpenGL ES에서와 같이 1.1 내 FragmentShader은 다음과 같습니다 0입니다) 그리고 이상한 그라디언트 효과를냅니다 ... & 텍스처는 고정 함수 파이프 라인에서 어떻게 결합 되었습니까?

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)를 사용하고 있습니다; glColor4f에 대한 나의 교체입니다 이 색상 1.0, 0.0, 1.0

... 어떻게 든 관련이 있다면, 여기에 1.0 내가 지금 무엇을 얻을 수 있습니다 : Now

을 그리고 싶어 :

What I want to see

이것을 달성하기위한 몇 가지 아이디어가 있습니까? 도움이 될 것입니다.

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

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

GL_MODULATE 그보다는 색상으로 질감을 곱 :

답변

15

당신의 텍스처는 OpenGL ES 1.1이 기본적으로 수행하는 방법을 정점 색상을 결합하려면, 당신은 당신의 조각 쉐이더이 원하는 것 그것에 추가.

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

0

피벗 대답은 나를 위해 큰 노력하고 있습니다. 난 그냥 (3.3 이상) GLSL의 최신 버전과 같을 것이다 방법을 추가하고 싶었 :

in vec2 passedUvCoords; 
in vec4 passedColor; 

out vec4 outColor; 

uniform sampler2D textureSampler; 

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

이 그냥 조각 쉐이더입니다.