2013-06-24 6 views
0

쉐이더와 OpenGL에 익숙하지 않습니다. 튜토리얼을 읽은 후 LibGDX를 사용하여 첫 번째 셰이더를 만들기로 결정했습니다.Libgdx - 기본 쉐이더가 작동하지 않습니다.

public class Application extends 
         ApplicationAdapter { 

    private ShaderProgram mShaderProgram; 
    private Mesh   mMesh; 

    @Override 
    public void create() { 
     this.createMesh(); 

     if (Gdx.graphics.isGL20Available()) { 
      this.createShaderProgram(); 
     } 

     this.log("" + this.mShaderProgram.isCompiled()); // outputs "true" 
    } 

    private void createMesh() { 
     this.mMesh = new Mesh(true, 3, 4, VertexAttribute.Position()); 

     this.mMesh.setIndices(new short[] { 0, 1, 2 }); 
     this.mMesh.setVertices(new float[] { 
       -0.5f, -0.5f, 0, 
       0f, 0.5f, 0, 
       0.5f, -0.5f, 0 
     }); 
    } 

    private void createShaderProgram() { 
     final FileHandle fragmentShader = Gdx.files.internal("fragment.txt"); 
     final FileHandle vertexShader = Gdx.files.internal("vertex.txt"); 

     this.mShaderProgram = new ShaderProgram(vertexShader, fragmentShader); 
    } 

    @Override 
    public void dispose() { 
     this.mMesh.dispose(); 
     if (this.mShaderProgram != null) { 
      this.mShaderProgram.dispose(); 
     } 
    } 

    private void log(final String message) { 
     Gdx.app.log("", message); 
    } 

    @Override 
    public void render() { 
     Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 

     if (Gdx.graphics.isGL20Available()) { 
      this.mShaderProgram.begin(); 
      this.mMesh.render(this.mShaderProgram, GL10.GL_TRIANGLES); 
      this.mShaderProgram.end(); 
     } 
     else { 
      this.mMesh.render(GL10.GL_TRIANGLES); 
     } 
    } 
} 

내 조각 쉐이더 :

void main() { 
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); 
} 

내 버텍스 쉐이더

문제는

내 자바 코드 ... 화면이 완전히 검은 색이다 :

void main() { 
    gl_Position = ftransform(); 
} 

ftransform() 대신 gl_Vertex을 사용하면 아무 것도 변경되지 않았습니다.

답변

0

웹을 검색 한 후 & 같은 일부 GLSL 기본 제공 속성이 gl_Vertexftransform()과 같은 GLSL 새 버전에서 더 이상 사용되지 않습니다.

이제는 직접 & 색상 속성을 등록해야한다는 것을 알지 못했습니다.

1

아무 것도 보이지 않는 이유는 정점 셰이더가 아무 것도하지 않기 때문입니다.

버텍스 쉐이더 :

#ifdef GL_ES 
precision mediump float; 
#endif 

attribute vec4 a_position; 

void main() 
{ 
    gl_Position = a_position; 
} 

난 당신이 더 나은 방법 쉐이더 작업을 이해하기 위해 몇 가지 쉐이더 튜토리얼에서 살펴 제안 당신이 최소한 다음을 수행해야 할 필요가 정확하게 코드를 작동하게하려면 OpenGL ES에서.

위의 쉐이더 코드를 빠르게 설명하려면 메쉬에서 "a_position"속성에 대한 정점 속성을 설정해야합니다. 버텍스 쉐이더는 단순히 그 위치 정보를 프래그먼트 셰이더에 전달합니다. 프래그먼트 셰이더는 렌더링 할 모든 조각에 흰색을 할당합니다.

+0

예 5 분 전에 튜토리얼에서이 기본 코드를 발견했으며 작동합니다. 그러나 GLSL에는 버텍스 쉐이더에서 ** a_position **와 같은 위치 데이터를 보유하는 ** gl_Vertex **와 * fixed * 파이프 라인을 시뮬레이트하는'ftransform()'함수가 내장 된 튜토리얼을 읽었습니다 이전 OpenGL 버전들 ('modelViewMatrix * position'). 새 변수를 만드는 대신 이러한 변수를 사용할 수 있습니까? 그러면 셰이더의 코드가 단순 해집니다. 조각 쉐이더에서 입력 ** gl_Color **에 대해 동일한 질문이 있습니다. – Flawyte

+0

당신은 OpenGL ES와 OpenGL이 다르다는 것과 언어마다 다른 부분을 가지고 있다는 것을 기억해야합니다. 내가 믿는 고정 파이프 라인 기능은 OpenGL ES 1.x에만 유효하고 OpenGL ES 2.0/3.0에는 유효하지 않습니다. 2.0에서는 값을 속성 또는 균일 한 변수로 전달해야합니다. libGDX에서 좀 더 복잡한 예제를 원하면이 답변을 참조하십시오. http://stackoverflow.com/questions/15398184/issue-with-shaders-matrices-cant-see-object/15421977#15421977 – Jyro117

+0

웹 검색 , 나는 GLSL의 새 버전에서'gl_Vertex'와'ftransform()'과 같은 일부 GLSL 내장 속성 및 함수가 사용되지 않을 것이라는 것을 발견했습니다. 나는 지금 너 자신에 의해 위치 & 색 속성을 등록해야한다는 것을 몰랐다. – Flawyte

관련 문제