我是新來的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()
沒有改變任何東西。
是的,我在5分鐘前在教程中找到了這個基本代碼,它工作正常。但在那段GLSL內置變量,包括一些教程閱讀** ** gl_Vertex持有像** ** a_position在頂點着色器的位置數據,和'ftransform()'函數模擬*固定*管道以前的OpenGL版本('modelViewMatrix * position')。是否有可能使用這些變量而不是創建新變量?這將簡化着色器的代碼。輸入** gl_Color **在片段着色器中的同樣問題。 – Flawyte
你必須記住,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
在網上搜索後,我發現一些GLSL內置屬性和功能,如'gl_Vertex'和'ftransform()'在GLSL的新版本過時。我不知道現在你必須自己註冊位置和顏色屬性。 – Flawyte