2013-06-24 51 views
0

我是新來的Shaders和OpenGL。閱讀了一些教程後,我決定創建我的第一個着色器(使用LibGDX)。Libgdx - 基本着色器不能正常工作

的問題是,屏幕全黑的...

我的Java代碼:

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(); 
} 

使用gl_Vertex而不是ftransform()沒有改變任何東西。

回答

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中。

要快速解釋一下上面的shader代碼,在你的網要設置爲「a_position」屬性頂點屬性。頂點着色器只是將該位置信息傳遞給片段着色器。片段着色器然後將白色分配給要呈現的所有片段。

+0

是的,我在5分鐘前在教程中找到了這個基本代碼,它工作正常。但在那段GLSL內置變量,包括一些教程閱讀** ** gl_Vertex持有像** ** a_position在頂點着色器的位置數據,和'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