2012-01-28 2 views
1

나는 그것이 작동한다고 생각했지만 여전히 내 버텍스 쉐이더에서 값을 변경하는 방법을 알 수 없습니다.GLSL (vertex shader)에서 float 변경

//i bind my shader 
shader.bind(); 

// Then trying to set the value in my vertex shader like so: 
GLuint test = glGetUniformLocation(shader.id(), "Test"); 
glUniform1f(test, 6.0f); 

// Do some other stuff like rendering an object 
// ... 

// then unbind shader 
shader.unbind(); 

이 내가 내 버텍스 쉐이더에서 변경하려는 값입니다 : 내가 뭘 OpenGL을에서 할 것은 다음은 각 렌더링를 들면,

uniform float Test = 0.66; // Doesn't work 
//const float Test = 0.66; // Works 

는하지만, 내가하려고 할 때 내 쉐이더 작동하지 않습니다 그것은 내 물건을 검은 색으로 만듭니다. 내가 glGetUniform (위치) 부분을 주석하고 다음 균일의 대신 CONST로 플로트를 사용하는 경우 내 쉐이더가 잘 작동하면

. 하지만 각 렌더링에서 쉐이더의 값을 변경할 수 있기를 원합니다. 그걸 위해서 유니폼을 써야했는데 ...?

내가 누락 된 부분이 있습니까? ??


편집 : ...

non constant expression in initialization

그래서 그것이 작동하기 위해서는 일정해야 그 어떤 존재 의미하지 않는다 :

이 Appearently 난 다음 GLSL 오류를 받고 있어요 이것을 동적 인 가치로 갖는 방법 ..?

uniform float Test; 

는 또한, 당신은 호출하기 전에 프로그램 객체 핸들 glUseProgram() 전화를해야 :이 같은 버텍스 쉐이더에서 유니폼을 선언해야

const float FresnelPower = 1.0; 
uniform float Eta;   // <---- MUST BE CONSTANT... 

const float F = ((1.0-Eta) * (1.0-Eta))/((1.0+Eta) * (1.0+Eta)); 

varying vec3 Reflect; 
varying vec3 Refract; 
varying float Ratio; 

void main() 
{ 
    vec4 ecPosition = gl_ModelViewMatrix * gl_Vertex; 
    vec3 ecPosition3 = ecPosition.xyz/ecPosition.w; 

    vec3 i = normalize(ecPosition3); 
    vec3 n = normalize(gl_NormalMatrix * gl_Normal); 

    Ratio = F + (1.0 - F) * pow((1.0 - dot(-i, n)), FresnelPower); 

    Refract = refract(i, n, Eta); 
    Refract = vec3(gl_TextureMatrix[0] * vec4(Refract, 1.0)); 

    Reflect = reflect(i, n); 
    Reflect = vec3(gl_TextureMatrix[0] * vec4(Reflect, 1.0)); 

    gl_Position = ftransform(); 
} 

답변

1

:

내 버텍스 쉐이더입니다 glUniform1f()이므로 shader.bind()의 내용이 맞는지 확인하십시오. glGetUniformLocation()을 한 번 호출하고 결과를 캐시하면 충분합니다. 또한 OpenGL 전화의 오류를 glGetError()으로 확인하여 다른 모든 것이 올바르게 작동하는지 확인하십시오. 값이 균일 변경할 수 없습니다에서와 같이

const float F = ((1.0-Eta) * (1.0-Eta))/((1.0+Eta) * (1.0+Eta)); 

const 수단, 시정 컴파일 :

당신의 편집에 응답,이 라인이 문제라고 생각합니다. F은 일정한 변수가 (컴파일 타임) 상수가 아니기 때문에 상수 일 수 없습니다. F을 선언 한 행을 main의 본문으로 이동하고 const 한정자를 제거하십시오. 그런 다음 쉐이더가 작동해야합니다. GLSL이 말할 때

+0

나는 당신이 말한 것을 시도해 보았습니다. 나는 glGetError()로 검사했고, 셰이더 (glUserProgram)를 바인딩하려 할 때 오류가 발생했습니다. 내가 조금 더 디버깅하고 glsl 컴파일 오류있어 나타났습니다. 나는 첫번째 세부 사항을 가진 포스트를 편집했다. 어쩌면 그 대답을 알 수 있을까요? – w00

1
uniform float Eta;   // <---- MUST BE CONSTANT... 

는 "상수"그것이 무엇을 의미하는 것은 컴파일시 일정하다. Eta 값은 특정 그리기 호출 내에서 확실히 일정합니다. 그러나 그것은 사이에서 그리기 호출을 변경할 수 있기 때문에 일정하지 않습니다. 컴파일러는 컴파일 타임에이 값이 무엇인지 알지 못합니다.

const 변수는 이고, 컴파일 시간은입니다. 따라서 컴파일 타임 상수로만 구성된 표현식으로 초기화해야합니다. uniform은 시간 상수를 컴파일하지 않으므로 const 변수를 초기화 할 수 없습니다.