gpt4 book ai didi

java - LibGDX : Rendering a TextureRegion renders whole texture

转载 作者:行者123 更新时间:2023-12-01 11:14:13 26 4
gpt4 key购买 nike

所以我有一个大的纹理,被分成 64x64 block 。

我使用将其加载到 LibGDX

texture = new Texture("texturemap.png");
regions = TextureRegion.split(texture, 64, 64);

我创建一个立方体(网格)

modelBuilder = new ModelBuilder();
cube = modelBuilder.createBox(Constants.cubeSize, Constants.cubeSize, Constants.cubeSize,
new Material(ColorAttribute.createDiffuse(Color.BLUE)),
VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal | VertexAttributes.Usage.TextureCoordinates);

在我的渲染外观中,我想选择要渲染的纹理区域,但它总是渲染整个纹理

Gdx.gl20.glEnable(GL20.GL_TEXTURE_2D);
Gdx.gl20.glEnable(GL20.GL_BLEND);
Gdx.gl20.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
Gdx.gl20.glCullFace(GL20.GL_BACK);
Gdx.gl20.glEnable(GL20.GL_DEPTH_TEST);


shaderProgram.begin();
//texture.bind();
regions[1][5].getTexture().bind();
shaderProgram.setUniformMatrix("u_projTrans", camera.combined);
shaderProgram.setAttributef("a_color", 1, 1, 1, 1);
shaderProgram.setUniformi("u_texture", 0);

for (int i = 0; i < chunks2.size; i ++ ) {
chunks2.get(i).render(shaderProgram);
}

shaderProgram.end();

我是否错过了TextureRegions 的要点?它总是渲染整个纹理?

最佳答案

您仅使用该区域来获取它指向的Texture。您实际上从未使用过TextureRegion本身。

TextureRegion 定义了纹理的一个区域。为此,它指的是Texture以及该纹理上区域的位置和大小。对于渲染,您通常需要标准化该位置和大小,也称为 UV 坐标。您可以通过使用第一个角的 getU()getV() 方法以及 getU2( ) 和另一个角的 getV2() 方法。正如您已经发现的那样,您可以使用 getTexture() 方法获取纹理。

实际上有两种方法可以做到这一点:

a) 将纹理区域烘焙到网格上,实际上缩放并移动网格的 UV 坐标。由于您使用的是 ModelBuilder ,您可以使用setUVRange创建零件时的方法。您正在使用的 createBox 方法是一种便捷方法,除非您正在调试,否则您可能希望避免使用它。检查it's source看看它到底做了什么。在您的情况下,您可以使用它:

modelBuilder.begin();
MeshPartBuilder mpb = modelBuilder.part("box", primitiveType, attributes, material);
mpb.setUVRange(yourRegion);
mpb.box(width, height, depth);
cube = modelBuilder.end();

b) 缩放着色器中的坐标。为此,您以平移和缩放的形式提供区域作为着色器的制服。请注意,这意味着您需要为每个单独的区域进行单独的渲染调用,因此,如果您使用TextureRegions是因为您打包了纹理以希望获得性能提升,那么这不是您想要的选项。

DefaultShader(例如 ModelBatch 使用)默认支持漫反射纹理的 TextureRegionHere就是一个例子。由于您使用自己的着色器,因此您必须在该着色器中实现它。它通常是顶点着色器中的一行,例如:

v_diffuseUV = u_diffuseUVTransform.xy + a_texCoord0 * u_diffuseUVTransform.zw;

其中 u_diffuseUVTransform 是包含 U 和 V (.xy) 以及 U2-U 和 V2-V (.zw) 的 vec4。

关于java - LibGDX : Rendering a TextureRegion renders whole texture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32028902/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com