我的网格没有渲染,但一切似乎都很好
My mesh is not rendering, but everything seems fine
没有日志,没有堆栈跟踪,只有 Libgdx 网格未渲染。我在 spriteBatch 上测试了 Shader,它工作得很好。网格对渲染方法没有任何作用,甚至没有图形错误...您知道问题出在哪里吗?
渲染代码如下:
Gdx.gl20.glClearColor(0f, 0f, 0f, 1f);
Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);
Gdx.gl20.glEnable(GL20.GL_BLEND);
Gdx.gl20.glEnable(GL20.GL_TEXTURE_2D);
Gdx.gl20.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
Mesh m = ShipMesh.MakeMeshGid(center,w,h,shipsels);
this.getDisplayTexture().bind();
ShipManager.ShipShader.begin();
ShipManager.ShipShader.setUniformi("u_mode", -4);
ShipManager.ShipShader.setUniformi("u_texture", 0);
ShipManager.ShipShader.setUniformMatrix(0, cam.combined);
m.render(ShipManager.ShipShader, GL20.GL_TRIANGLES);
ShipManager.ShipShader.end();
我使用的着色器使用基本的直通着色器和这个片段着色器:
varying vec4 vColor;
varying vec2 vTexCoord0;
uniform sampler2D u_texture;
uniform int u_mode;
void main()
{
vec4 col = vec4(1, 0, 0.682,1);
if (u_mode == -4){
col = vec4(vTexCoord0.xy,0.,1.);
}
if (u_mode == -3){
col = vec4(0.);
}
if (u_mode == -2){
col = vec4(0.,0.,0.,1.);
}
if (u_mode == -1){
col = vec4(1.);
}
if (u_mode == 0){
col = vec4(vColor.rgb,1);
}
if(u_mode == 1){
col = texture2D(u_texture, vTexCoord0);
}
gl_FragColor = col;
}
对于 MakeMeshGrid 方法,我使用 MeshBuilder:
public static Mesh MakeMeshGid(Vector2 center,int width,int height,Shipsel[][] data){
MeshBuilder meshBuilder = new MeshBuilder();
meshBuilder.begin(Usage.Position | Usage.TextureCoordinates | Usage.ColorPacked);
for (Shipsel[]sh:data){
for (Shipsel s:sh){
if (s!= null){
meshBuilder.part(s.getX()+":"+s.getY(), GL20.GL_TRIANGLES);
meshBuilder.setColor(Color.WHITE);
Vector3[] bounds = getShipselBounds(width,height,s,center);
Vector2[] uvs = getUVs(width,height,s);
MeshPartBuilder.VertexInfo v1 = new MeshPartBuilder.VertexInfo().setPos(bounds[0]).setCol(null).setUV(uvs[0]);
MeshPartBuilder.VertexInfo v2 = new MeshPartBuilder.VertexInfo().setPos(bounds[1]).setCol(null).setUV(uvs[1]);
MeshPartBuilder.VertexInfo v3 = new MeshPartBuilder.VertexInfo().setPos(bounds[2]).setCol(null).setUV(uvs[2]);
MeshPartBuilder.VertexInfo v4 = new MeshPartBuilder.VertexInfo().setPos(bounds[3]).setCol(null).setUV(uvs[3]);
meshBuilder.rect(v1, v2, v3, v4);
}
}
}
Mesh mesh = meshBuilder.end();
return mesh;
}
private static Vector3[] getShipselBounds(int w,int h,Shipsel s, Vector2 center) {
Vector3[] bounds = new Vector3[4];
bounds[0] = new Vector3(0.5f, 0.5f,0).add(s.getX() - w / 2,
s.getY() - h / 2,0).add(center.x,center.y,0);
bounds[1] = new Vector3(-0.5f, 0.5f,0).add(s.getX() - w / 2,
s.getY() - h / 2,0).add(center.x,center.y,0);
bounds[2] = new Vector3(-0.5f, -0.5f,0).add(s.getX() - w / 2,
s.getY() - h / 2,0).add(center.x,center.y,0);
bounds[3] = new Vector3(0.5f, -0.5f,0).add(s.getX() - w / 2,
s.getY() - h / 2,0).add(center.x,center.y,0);
return bounds;
}
private static Vector2[] getUVs(int w,int h,Shipsel s) {
Vector2[] uvs = new Vector2[4];
uvs[0] = new Vector2((s.getX() + 1) / (w + 1), (s.getY() + 1) / (h + 1));
uvs[1] = new Vector2((s.getX()) / (w + 1), (s.getY() + 1) / (h + 1));
uvs[2] = new Vector2((s.getX()) / (w + 1), (s.getY()) / (h + 1));
uvs[3] = new Vector2((s.getX() + 1) / (w + 1), (s.getY()) / (h + 1));
return uvs;
}
至少给我一个提示或类似的东西。
更新:
当我四处修修补补时,我有一些东西要渲染,但它只像这样工作就够奇怪了:
Mesh m = ShipMesh.MakeMeshGid(center,w,h,shipsels);
this.getDisplayTexture().bind();
ShipManager.ShipShader.begin();
ShipManager.ShipShader.setUniformi("u_mode", -4);
ShipManager.ShipShader.setUniformi("u_texture", 0);
ShipManager.ShipShader.setUniformMatrix(0, cam.combined);
m.render(ShipManager.ShipShader, GL20.GL_TRIANGLES);
ShipManager.ShipShader.end();
m.dispose();
ShipManager.ShipShader.begin();
ShipManager.ShipShader.setUniformi("u_mode", 1);
ShipManager.ShipShader.end();
Texture tex = getDisplayTexture();
Batch b = new SpriteBatch();
b.setShader(ShipManager.ShipShader);
b.setProjectionMatrix(cam.combined);
Vector2 o = new Vector2(center);
o.sub(matMap.getWidth()/2, matMap.getHeight()/2);
b.begin();
b.draw(tex, o.x, o.y,matMap.getWidth(),matMap.getHeight());
b.end();
b.dispose();
在这种格式下,其他一切都和以前一样,它把网格画成黑色,如果我去掉 Spritebatch 部分,它就不起作用了。
它应该绘制纹理坐标,而不是纯黑色。
我想我遗漏了 SpriteBatch 中包含的一些东西。
所以我发现这是一个搞乱 UV 的愚蠢的转换错误。 UV 正在处理整数而不是浮点数。对于未渲染的网格,调用Gdx.gl.glDepthMask(true);
在 mesh.render();
解决了这个问题之后,使用的精灵批次解决了 :)
希望对您有所帮助:)。
没有日志,没有堆栈跟踪,只有 Libgdx 网格未渲染。我在 spriteBatch 上测试了 Shader,它工作得很好。网格对渲染方法没有任何作用,甚至没有图形错误...您知道问题出在哪里吗?
渲染代码如下:
Gdx.gl20.glClearColor(0f, 0f, 0f, 1f);
Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);
Gdx.gl20.glEnable(GL20.GL_BLEND);
Gdx.gl20.glEnable(GL20.GL_TEXTURE_2D);
Gdx.gl20.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
Mesh m = ShipMesh.MakeMeshGid(center,w,h,shipsels);
this.getDisplayTexture().bind();
ShipManager.ShipShader.begin();
ShipManager.ShipShader.setUniformi("u_mode", -4);
ShipManager.ShipShader.setUniformi("u_texture", 0);
ShipManager.ShipShader.setUniformMatrix(0, cam.combined);
m.render(ShipManager.ShipShader, GL20.GL_TRIANGLES);
ShipManager.ShipShader.end();
我使用的着色器使用基本的直通着色器和这个片段着色器:
varying vec4 vColor;
varying vec2 vTexCoord0;
uniform sampler2D u_texture;
uniform int u_mode;
void main()
{
vec4 col = vec4(1, 0, 0.682,1);
if (u_mode == -4){
col = vec4(vTexCoord0.xy,0.,1.);
}
if (u_mode == -3){
col = vec4(0.);
}
if (u_mode == -2){
col = vec4(0.,0.,0.,1.);
}
if (u_mode == -1){
col = vec4(1.);
}
if (u_mode == 0){
col = vec4(vColor.rgb,1);
}
if(u_mode == 1){
col = texture2D(u_texture, vTexCoord0);
}
gl_FragColor = col;
}
对于 MakeMeshGrid 方法,我使用 MeshBuilder:
public static Mesh MakeMeshGid(Vector2 center,int width,int height,Shipsel[][] data){
MeshBuilder meshBuilder = new MeshBuilder();
meshBuilder.begin(Usage.Position | Usage.TextureCoordinates | Usage.ColorPacked);
for (Shipsel[]sh:data){
for (Shipsel s:sh){
if (s!= null){
meshBuilder.part(s.getX()+":"+s.getY(), GL20.GL_TRIANGLES);
meshBuilder.setColor(Color.WHITE);
Vector3[] bounds = getShipselBounds(width,height,s,center);
Vector2[] uvs = getUVs(width,height,s);
MeshPartBuilder.VertexInfo v1 = new MeshPartBuilder.VertexInfo().setPos(bounds[0]).setCol(null).setUV(uvs[0]);
MeshPartBuilder.VertexInfo v2 = new MeshPartBuilder.VertexInfo().setPos(bounds[1]).setCol(null).setUV(uvs[1]);
MeshPartBuilder.VertexInfo v3 = new MeshPartBuilder.VertexInfo().setPos(bounds[2]).setCol(null).setUV(uvs[2]);
MeshPartBuilder.VertexInfo v4 = new MeshPartBuilder.VertexInfo().setPos(bounds[3]).setCol(null).setUV(uvs[3]);
meshBuilder.rect(v1, v2, v3, v4);
}
}
}
Mesh mesh = meshBuilder.end();
return mesh;
}
private static Vector3[] getShipselBounds(int w,int h,Shipsel s, Vector2 center) {
Vector3[] bounds = new Vector3[4];
bounds[0] = new Vector3(0.5f, 0.5f,0).add(s.getX() - w / 2,
s.getY() - h / 2,0).add(center.x,center.y,0);
bounds[1] = new Vector3(-0.5f, 0.5f,0).add(s.getX() - w / 2,
s.getY() - h / 2,0).add(center.x,center.y,0);
bounds[2] = new Vector3(-0.5f, -0.5f,0).add(s.getX() - w / 2,
s.getY() - h / 2,0).add(center.x,center.y,0);
bounds[3] = new Vector3(0.5f, -0.5f,0).add(s.getX() - w / 2,
s.getY() - h / 2,0).add(center.x,center.y,0);
return bounds;
}
private static Vector2[] getUVs(int w,int h,Shipsel s) {
Vector2[] uvs = new Vector2[4];
uvs[0] = new Vector2((s.getX() + 1) / (w + 1), (s.getY() + 1) / (h + 1));
uvs[1] = new Vector2((s.getX()) / (w + 1), (s.getY() + 1) / (h + 1));
uvs[2] = new Vector2((s.getX()) / (w + 1), (s.getY()) / (h + 1));
uvs[3] = new Vector2((s.getX() + 1) / (w + 1), (s.getY()) / (h + 1));
return uvs;
}
至少给我一个提示或类似的东西。
更新:
当我四处修修补补时,我有一些东西要渲染,但它只像这样工作就够奇怪了:
Mesh m = ShipMesh.MakeMeshGid(center,w,h,shipsels);
this.getDisplayTexture().bind();
ShipManager.ShipShader.begin();
ShipManager.ShipShader.setUniformi("u_mode", -4);
ShipManager.ShipShader.setUniformi("u_texture", 0);
ShipManager.ShipShader.setUniformMatrix(0, cam.combined);
m.render(ShipManager.ShipShader, GL20.GL_TRIANGLES);
ShipManager.ShipShader.end();
m.dispose();
ShipManager.ShipShader.begin();
ShipManager.ShipShader.setUniformi("u_mode", 1);
ShipManager.ShipShader.end();
Texture tex = getDisplayTexture();
Batch b = new SpriteBatch();
b.setShader(ShipManager.ShipShader);
b.setProjectionMatrix(cam.combined);
Vector2 o = new Vector2(center);
o.sub(matMap.getWidth()/2, matMap.getHeight()/2);
b.begin();
b.draw(tex, o.x, o.y,matMap.getWidth(),matMap.getHeight());
b.end();
b.dispose();
在这种格式下,其他一切都和以前一样,它把网格画成黑色,如果我去掉 Spritebatch 部分,它就不起作用了。
它应该绘制纹理坐标,而不是纯黑色。
我想我遗漏了 SpriteBatch 中包含的一些东西。
所以我发现这是一个搞乱 UV 的愚蠢的转换错误。 UV 正在处理整数而不是浮点数。对于未渲染的网格,调用Gdx.gl.glDepthMask(true);
在 mesh.render();
解决了这个问题之后,使用的精灵批次解决了 :)
希望对您有所帮助:)。