2012-09-23 1 views
1

내 게임 엔진을 PC에서 Android로 이식하려고합니다. 도움이되는 문서가 아닌 동일한 방식으로 작동하지 않는 몇 가지 OpenGL 기능에 문제가 있습니다. 이유를 이해하십시오.GLES 2.0에서 활성 유니폼 및 버텍스 속성 조회하기

문제는 PC에서 셰이더 프로그램과 함께 제공됩니다. OpenGL을 통해 특성 및 유니폼을 쿼리하여 키 생성 된 콜렉션을 구성하므로 일반적인 매개 변수를 쉽게 전달할 수 있습니다.

void LoadUniforms() 
    { 
     int activeUniforms; 
     GL.GetProgram(m_ID, ProgramParameter.ActiveUniforms, out activeUniforms); 
     for (int i = 0; i < activeUniforms; i++) 
     { 
      int size; 
      ActiveUniformType type; 
      string name = GL.GetActiveUniform(m_ID, i, out size, out type); 
      ShaderUniform uniform = null; 

      uniform = new ShaderUniform(this, name, size, type); 
      if (uniform != null) 
       m_uniformParameters.Add(uniform); 
     } 
    } 

난 항상 최대 길이와 activeUniforms 0을 얻는다 다음으로 OpenTK의 GLES 2.0로 변환을 시도 : 나는 키가있는 콜렉션을 구성하기 위해 다음과 같은 기능을 사용하여 PC에

.

void LoadUniforms() 
    { 
     int length = 0; 
     int maxLength = 0; 
     GL.GetProgram(m_ID, All.ActiveUniformMaxLength, ref maxLength); 

     int activeUniforms = 0; 
     GL.GetProgram(m_ID, All.ActiveUniforms, ref activeUniforms); 
     for (int i = 0; i < activeUniforms; i++) 
     { 
      All type = All.None; 
      int size = 0; 
      string name = string.Empty; 
      GL.GetActiveUniform(m_ID, i, maxLength, ref length, ref size, ref type, name); 

      ShaderUniform uniform = new ShaderUniform(this, name, size, (ShaderUniformType)type); 
      if (uniform != null) 
       m_uniformParameters.Add(uniform); 
     } 
    } 

그래서 나는 어쩌면 OpenTK의 GLES 2.0 인터페이스가 완료되지 것을 의심 Android.Opengl 시도로 이동하지만 여전히 같은 문제.

이제 질문이 남았습니다. 셰이더 프로그램을 컴파일하고 링크하는 것과 활성 유니폼을 쿼리 할 수있는 것 사이에 어떤 단계가 빠졌습니까? 또한 활성 속성을 쿼리 할 때 정확히 동일한 문제가 발생합니다 (항상 최대 길이 및 개수에 대해 0을 얻음).

테스트에 사용한 버텍스 셰이더는 다음과 같습니다.

uniform mat4 World; 
uniform mat4 View; 
uniform mat4 Projection; 

attribute vec3 Posiiton; 
attribute vec2 TexCoord; 

varying vec2 TexCoord0; 

void main() 
{ 
    mat4 worldViewProject = Projection * View * World; 
    vec4 pos = vec4(Position, 1); 
    pos *= World; 
    pos *= View; 
    pos *= Project; 
    gl_Position = pos; 
    TexCoord0 = TexCoord; 
} 

는 정말 게임이 사용하는 모든 단일 쉐이더를 통해 이동하고 수동 I가 익숙해 성장했습니다 더 자동 방법으로 버릇 후 매개 변수를 매핑해야 싫어한다. 그래서 나는 그것이 정말로 내가 놓친 뭔가이기를 바란다.

답변

0

글쎄, 나는 그것을 알아 냈다. #include 문을 처리하도록 설정된 전처리 기는 EOL/EOF 예외를 생성하는 파일에 너무 많은 인용 부호를 삽입하는 것이 었습니다. 이는 실행을 통해 줄 단위 단계를 수행 할 때까지 어떤 이유로 throw되지 않았습니다. 일단 내가 간과 한 오타 때문에 셰이더에서 컴파일 오류가 발생하기 시작했다. 그런 다음 PC 버전과 똑같이 작동했다.

관련 문제