9 java shader opengl-es libgdx
我正在尝试使用libgdx来理解着色器,来自XNA/HLSL背景.我试图获得一个vert/frag着色器对来重现我没有着色器得到的输出,但它没有显示任何东西.
着色器创建:
void SetupShader()
{
ShaderProgram.pedantic = false;
shader = new ShaderProgram(
Gdx.files.internal("assets/default.vert").readString(),
Gdx.files.internal("assets/default.frag").readString());
if(!shader.isCompiled()) {
Gdx.app.log("Problem loading shader:", shader.getLog());
}
batch.setShader(shader);
}
Run Code Online (Sandbox Code Playgroud)
default.vert:
attribute vec4 a_Position;
attribute vec4 a_Normal;
attribute vec2 a_TexCoord;
attribute vec4 a_Color;
uniform mat4 u_projTrans;
varying vec2 v_texCoords;
varying vec4 v_color;
void main() {
v_color = a_Color;
v_texCoords = a_TexCoord;
gl_Position = u_projTrans * a_Position;
}
Run Code Online (Sandbox Code Playgroud)
default.frag:
#ifdef GL_ES
precision mediump float;
#endif
varying vec2 v_texCoords;
varying vec4 v_color;
void main() {
gl_FragColor = v_color;
}
Run Code Online (Sandbox Code Playgroud)
渲染:
batch.begin();
for (GameObject gObj : gameObjects)
gObj.Draw(batch);
batch.end();
Run Code Online (Sandbox Code Playgroud)
这里有什么建议?我也是OpenGL-ES的新手,所以我可能会遗漏一些明显的东西.在发布之前,我环顾了一下,文档SpriteBatch.setShader(ShaderProgram)如下:
设置要在GLES 2.0环境中使用的着色器.顶点位置属性称为"a_position",纹理坐标属性称为"a_texCoords0",颜色属性称为"a_color".见ShaderProgram.POSITION_ATTRIBUTE,ShaderProgram.COLOR_ATTRIBUTE和ShaderProgram.TEXCOORD_ATTRIBUTE它得到"0" appened以指示使用第一纹理单元的.投影矩阵是通过所谓的"u_proj"一个MAT4均匀上传,变换矩阵是通过所谓的"u_trans"均匀上传,将合并的变换和投影MATRX是经由所谓的"u_projTrans"一个MAT4均匀上传.纹理采样器通过称为"u_texture"的统一传递.使用null参数调用此方法以使用默认着色器.
小智 12
看完代码后SpriteBatch,我的代码中出现了一些错误.以下是正确的着色器:
default.vert:
attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;
uniform mat4 u_projTrans;
varying vec4 v_color;
varying vec2 v_texCoords;
void main() {
v_color = a_color;
v_texCoords = a_texCoord0;
gl_Position = u_projTrans * a_position;
}
Run Code Online (Sandbox Code Playgroud)
default.frag:
#ifdef GL_ES
precision mediump float;
#endif
varying vec4 v_color;
varying vec2 v_texCoords;
uniform sampler2D u_texture;
void main() {
gl_FragColor = v_color * texture2D(u_texture, v_texCoords);
}
Run Code Online (Sandbox Code Playgroud)