2012-07-08 2 views
1

OpenGL ES 2.0을 처음 접했으니 제발 ... 내 조각 쉐이더에 BOOL 플래그를 전달하고 싶습니다. 내 앱에서 특정 터치 이벤트가 발생하면 gl_FragColor가 다르게 렌더링됩니다. 이 vec2 특성을 사용하여 시도하고 내 "BOOL"로 .x 값을 "속이는"하지만 Shader가 값을 얻기 전에 OpenGL에서 값을 0.0에서 1.0로 정규화하는 것처럼 보입니다. 그래서 내 앱에서 0.0으로 설정했는데 셰이더가 그 일을하는 동안 값은 결국 1.0에 도달합니다. 어떤 제안이라도 대단히 감사하겠습니다.Fragment Shader에 BOOL 값 보내기 iOS/iPhone의 OpenGL ES 2.0

VertexAttrib 코드 :

// set up context, shaders, use program etc. 

[filterProgram addAttribute:@"inputBrushMode"]; 
inputBrushModeAttribute = [filterProgram attributeIndex:@"inputBrushMode"]; 

bMode[0] = 0.0; 
bMode[1] = 0.0; 

glVertexAttribPointer(inputBrushModeAttribute, 2, GL_FLOAT, 0, 0, bMode); 

현재 버텍스 쉐이더 코드 :

... 
attribute vec2 inputBrushMode; 
varying highp float brushMode; 

void main() 
{ 
    gl_Position = position; 
    ... 
    brushMode = inputBrushMode.x; 
} 

현재 조각 쉐이더 코드 :

... 
varying highp float brushMode; 

void main() 
{ 
    if(brushMode < 0.5) { 
     // render the texture 
     gl_FragColor = texture2D(inputImageTexture, textureCoordinate); 
    } else { 
     // cover things in yellow funk 
     gl_FragColor = vec4(1,1,0,1); 
    } 
} 

미리 감사드립니다.

+2

는 "이 OpenGL을 쉐이더 전에 0.0 ~ 1.0의 값을 정상화처럼 보이는 그것의 홀드 (Ahold)을 얻는다"쉐이더에서, 그래서 같은 값을 체크? 정점 속성을 사용하는 이유는 무엇입니까? 둘째,이 속성을 제공하기위한 설정 코드는 어디에 있습니까? 'glVertexAttribPointer'를 올바르게 사용하고 있습니까? –

+0

나는 제복의 가치가 나중에 바뀔 수 없다는 인상을 받았다. 사실이 아닌가? 나는 꽤'glVertexAttribPointer'를 올바르게 사용하고 있다고 확신한다 - 나는 그 코드를 추가 할 것이다. 감사. – taber

+0

균일 한 값은 언제든지 변경할 수 있습니다 (배치의 중간을 제외하고). – Tim

답변

7

bool을 glUniform (1.0 또는 0.0)으로 대신 생성하십시오. 값을 glUniform1f(GLint location, GLfloat v0)으로 설정하십시오. 첫째, 당신은 왜 유니폼을 사용하지 않는

if (my_uniform < 0.5) { 
    // FALSE 
} else { 
    // TRUE 
} 
+4

왜 그냥'if (my_uniform == 0.0) {' –

+3

부동 소수점 때문에. –

+1

수동으로 0.0 또는 1.0으로 설정하면 정밀도 문제가 발생하지 않아야합니다. float에 전달하기 전에 float에 수학 연산을 수행하면 반올림 오류가 발생할 수 있습니다. –