2015-02-02 2 views
-1

저는 기본적인 게임 요구를 포함하는 게임 엔진을 만들고 있습니다. glslDevil 사용하여 내 바인딩 VBO 메서드를 InvalidValue 오류가 throw됩니다. glVertexPointer 호출 및 glEnableVertexPointer 호출로 인해 문제가 발생합니다. 정점 속성 색인이 문제의 원인입니다. 색인은 4294967295이고 15를 훨씬 넘습니다. 다른 모든 것이 완벽하게 작동합니다. 나는 OpenTK를 사용하고있다. 다음은 속성에 바인딩 메소드입니다.왜 glEnableVertexPointer와 glVertexPointer를 호출하면 InvalidValue가 발생합니까?

public void BindToAttribute(ShaderProgram prog, string attribute) 
    { 
     int location = GL.GetAttribLocation(prog.ProgramID, attribute); 
     GL.EnableVertexAttribArray(location); 
     Bind(); 
     GL.VertexAttribPointer(location, Size, PointerType, true, TSize, 0); 
    } 
public void Bind() 
    { 
     GL.BindBuffer(Target, ID); 
    } 

여기 내 셰이더가 필요합니다.

버텍스 쉐이더 :

uniform mat4 transform; 
uniform mat4 projection; 
uniform mat4 camera; 
in vec3 vertex; 
in vec3 normal; 
in vec4 color; 
in vec2 uv; 
out vec3 rnormal; 
out vec4 rcolor; 
out vec2 ruv; 

void main(void) 
{ 
    rcolor = color; 
    rnormal = normal; 
    ruv = uv; 
    gl_Position = camera * projection * transform * vec4(vertex, 1); 
} 

조각 쉐이더 :

in vec3 rnormal; 
in vec4 rcolor; 
in vec2 ruv; 
uniform sampler2D texture; 

void main(void) 
{ 
    gl_FragColor = texture2D(texture, ruv) * rcolor; 
} 

내가 제대로 인덱스를 취득하지 않거나 다른 문제가 있습니까?

+1

쉐이더가 성공적으로 컴파일되고 있습니까? 나는 당신이 최근의 표기법 ('in','out')을 부분적으로 사용하고 있음을 알아 차리지 만, 처음에는 대응하는'# version '이 없다는 것을 알았습니다. –

+0

@RetoKoradi 모든 셰이더가 잘 컴파일됩니다. 셰이더 에러 핸들러와 glError 핸들러가 있습니다. glError 핸들러 만 InvalidValue로 시작하는 것 같습니다. 나는'layout (location = x) '을 사용해야한다고 생각한다. – user3693036

+0

'GetAttribLocation()'도 괜찮을 것입니다. –

답변

0

당신이 얻고있는 색인이 문제인 것처럼 보입니다 : 그것은 opengl이 그 이름으로 유효한 속성/유니폼을 찾지 못할 때 얻을 수있는 색인입니다.

에 갈 수있는 몇 가지가 있습니다

  • 당신이 (민감하고 이것 저것 경우 확인)
  • 유니폼이 존재하고 쉐이더 프로그램에 존재하지 않는 문자열을 전달하는 당신 올바른 문자열을 전달하고 있지만 셰이더에서 해당 특성을 사용하지 않으므로 드라이버가 최적화로 인해 최종 코드에서 해당 특성의 모든 항목을 제거했습니다 (따라서 더 이상 존재하지 않습니다).

일반적으로, 그 숫자는 보여줍니다. OpenGL은이 유니폼을 발견하거나, 속성 수 없습니다들

편집 찾고 있던 :

한 트릭은 다음과 같습니다의 당신은 많은 값의 합계 값을 리턴 일부 픽셀 쉐이더 코드가 있다고 가정하자 :

out vec4 color; 

void main() 
{ 
    // this shader does many calculations when you are 
    // using many values, but let's assume you want to debug 
    // just the diffuse color... how do you do it? 
    // if you change the output to return just the diffuse color, 
    // the optimizer might remove code and you might have problems 
    // 
    // if you have this 
    color = various_calculation_1 + various_calculation_2 + ....; 
    // what you can do is the following 
    color *= 0.0000001f; // so basically it's still calculated 
          // but it almost won't show up 
    color += value_to_debug; // example, the diffuse color 
} 
+0

쉐이더 컴파일러가 최적화되도록 설계된 것을 결코 알지 못했습니다. – user3693036

관련 문제