2012-02-26 6 views
3

안녕하세요 저는 GLSL을 처음 사용하고있어서 몇 가지 문제가 있습니다.GLSL 2.0 색상 및 질감

색상이나 텍스처를 사용하기 위해 GLSL 셰이더 쌍을 만들려고하는데 잘못된 것을해야합니다. 문제는 uUseTexture를 0 (색상을 나타내야 함)로 설정하면 작동하지 않는다는 것입니다 (오브젝트가 색상이 지정되지 않음). 나는 색칠 코드가 별도로 작동한다는 것을 알고, 어떤 힌트가 if 문을 사용하여 작동하지 않는 이유는 무엇입니까? 여기

코드입니다 :

// 조각

precision mediump float; 

uniform int uUseTexture; 
uniform sampler2D uSampler; 

varying vec4 vColor; 
varying vec2 vTextureCoord; 

void main(void) { 

    if(uUseTexture == 1) { 
     gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t)); 
    } else { 
     gl_FragColor = vColor; 
    } 

} 

// 정점

attribute vec3 aVertexPosition; 
attribute vec4 aVertexColor; 
attribute vec2 aTextureCoord; 

uniform int uUseTexture; 
uniform mat4 uMVMatrix; 
uniform mat4 uPMatrix; 

varying vec4 vColor; 
varying vec2 vTextureCoord; 

void main(void) { 
    gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0); 

    if(uUseTexture == 1) { 
     vTextureCoord = aTextureCoord; 
    } else { 
     vColor = aVertexColor; 
    } 
+0

이'vec2 (vTextureCoord.s, vTextureCoord.t)'는'vTextureCoord.st'이어야합니다. GLSL에서 [swizzle masks] (http://www.opengl.org/wiki/GLSL_Types#Swizzling)가 어떻게 작동하는지 살펴 봐야합니다. –

+0

'if (uUseTexture == 1)'을'if (true)'로 대체하면 같은 쉐이더 코드가 작동한다는 것을 의미합니까? – rotoglup

답변

5

아무것도 즉시 코드 너머로이기는 떠오르는 없지만, 내가 가지고 싶습니다 이 사용 사례는 if 문 없이도 적용될 수 있다고 지적합니다. 예를 들어, 대신 INT의 float로서 uUseTexture을 치료하자 (당신이 쉐이더에서 캐스팅 할 수 있지만이 더 재미있다) :

// 정점

attribute vec3 aVertexPosition; 
attribute vec4 aVertexColor; 
attribute vec2 aTextureCoord; 

uniform mat4 uMVMatrix; 
uniform mat4 uPMatrix; 

varying vec4 vColor; 
varying vec2 vTextureCoord; 

void main(void) { 
    gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0); 
    // It may actually be faster to just assign both of these anyway 
    vTextureCoord = aTextureCoord; 
    vColor = aVertexColor; 
} 

// 조각

uniform float uUseTexture; 
uniform sampler2D uSampler; 

varying vec4 vColor; 
varying vec2 vTextureCoord; 

void main(void) { 
    // vTextureCoord is already a vec2, BTW 
    vec4 texColor = texture2D(uSampler, vTextureCoord) * uUseTexture; 
    vec4 vertColor = vColor * (1.0 - uUseTexture); 
    gl_FragColor = texColor + vertColor; 
} 

이제 uUseTexture는 사용하려는 각 색상 소스의 양에 대한 모듈레이터 역할을합니다. 그리고 0.5로 설정하고 반 텍스처/반 꼭지점 색상을 얻을 수 있다는 점에서보다 유연합니다!

놀라운 사실은 if 문을 사용할 때 쉐이더 컴파일러가 백그라운드에서 수행하고있는 가능성이 있다는 것입니다. 일반적으로 하드웨어를 사용하는 것이 더 효율적입니다.

+0

빠른 응답을 주셔서 감사합니다. 쉐이더와 관련이없는 문제가 발견되었습니다. 2 대신 항목 크기 22로 텍스처 좌표를 버퍼링하는 것으로 나타났습니다. 더 자야합니다. :) 감사합니다. 변조기 힌트, 그것을 밖으로 시도합니다 :) – brunom