Graphics libgdx:显示加载模型的线框
我一直在互联网上拼命寻找解决方案。。。但是除了函数Graphics libgdx:显示加载模型的线框,graphics,libgdx,rendering,wireframe,Graphics,Libgdx,Rendering,Wireframe,我一直在互联网上拼命寻找解决方案。。。但是除了函数glDrawArrays之外,我没有得到更多的东西。我不知道如何使用它,也不知道为什么它不起作用。。。我想渲染使用ObjLoader加载的模型的多边形线(或顶点线)。相反,它一直在向我展示白色边框 我正在使用libgdx1.0.0 这是我的密码: public class Teapot extends ApplicationAdapter { ModelBatch batch; ModelInstance m; Camer
glDrawArrays
之外,我没有得到更多的东西。我不知道如何使用它,也不知道为什么它不起作用。。。我想渲染使用ObjLoader加载的模型的多边形线(或顶点线)。相反,它一直在向我展示白色边框
我正在使用libgdx1.0.0
这是我的密码:
public class Teapot extends ApplicationAdapter {
ModelBatch batch;
ModelInstance m;
Camera cam;
CameraInputController camController;
Environment environment;
@Override
public void create () {
batch = new ModelBatch();
environment = new Environment();
environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.4f, 0.4f, 0.4f, 1f));
environment.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, -1f, -0.8f, -0.2f));
cam = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
cam.position.set(0, 0, 5f);
cam.lookAt(0,0,0);
cam.position.add(0, 2, 0);
cam.near = 1f;
cam.far = 100f;
cam.update();
camController = new CameraInputController(cam);
Gdx.input.setInputProcessor(camController);
Model model = new ObjLoader().loadModel(Gdx.files.internal("teapot.obj"), true);
m = new ModelInstance(model);
}
@Override
public void render () {
Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
Gdx.gl.glDrawArrays(GL20.GL_TRIANGLES, 0, 3);
batch.begin(cam);
batch.render(m);
batch.end();
}
}
我使用的
teapot.obj
有几种不同的方法可以做到这一点。基本上,问题是加载的模型包含关于它是什么类型的模型(三角形,而不是直线)的信息,ModelBatch查看这些信息以决定如何绘制它
最直接的方法是以指定模型行的格式导出模型,然后使用将其转换为libgdx的本机格式(G3D)。我认为不可能将.obj
文件指定为行,因此您可能需要FBX或Collada之类的东西
下面是我能想到的最简单的方法,它可以在不愚弄模型文件的情况下快速获得肮脏的结果:
子类ModelInstance
,并像这样重写以下方法:
public Renderable getRenderable(final Renderable out, final Node node,
final NodePart nodePart) {
super.getRenderable(out, node, nodePart);
out.primitiveType = GL20.GL_LINE_STRIP;
return out;
}
然后使用这个子类而不是ModelInstance。这将告诉ModelBatch网格是一个线条条网格,以使其绘制线条。缺点是,它会按照文件中显示的顺序连接所有顶点,因此会有一些意外的额外线条在某些位置跨越模型。您可以使用
GL\u线
,但这样会有一堆缺失的线段。您还可以使用着色器设置基本体类型,然后将其提供给modelBatch实例:
modelBatch = new ModelBatch(new DefaultShaderProvider() {
@Override
protected Shader createShader(Renderable renderable) {
return new WireframeShader(renderable, config);
}
});
WireframeShader.java:
public class WireframeShader extends DefaultShader {
public static final int PRIMITIVE_TYPE = GL20.GL_LINE_STRIP;
private int mSavedPrimitiveType;
public WireframeShader(Renderable renderable) {
super(renderable);
}
public WireframeShader(Renderable renderable, Config config) {
super(renderable, config);
}
public WireframeShader(Renderable renderable, Config config, String prefix) {
super(renderable, config, prefix);
}
public WireframeShader(Renderable renderable, Config config, String prefix, String vertexShader, String fragmentShader) {
super(renderable, config, prefix, vertexShader, fragmentShader);
}
public WireframeShader(Renderable renderable, Config config, ShaderProgram shaderProgram) {
super(renderable, config, shaderProgram);
}
@Override
public void render(Renderable renderable) {
setPrimitiveType(renderable);
super.render(renderable);
restorePrimitiveType(renderable);
}
@Override
public void render(Renderable renderable, Attributes combinedAttributes) {
setPrimitiveType(renderable);
super.render(renderable, combinedAttributes);
restorePrimitiveType(renderable);
}
private void restorePrimitiveType(Renderable renderable) {
renderable.primitiveType = mSavedPrimitiveType; // gdxVersion = '1.6.4'
//consider using the following for newer gdx versions instead as per kami comment:
//renderable.meshPart.primitiveType = mSavedPrimitiveType
}
private void setPrimitiveType(Renderable renderable) {
mSavedPrimitiveType = renderable.primitiveType; //gdxVersion = '1.6.4'
renderable.primitiveType = PRIMITIVE_TYPE; //gdxVersion = '1.6.4'
//consider using the following for newer gdx versions instead as per kami comment:
//mSavedPrimitiveType = renderable.meshPart.primitiveType;
//renderable.meshPart.primitiveType = PRIMITIVE_TYPE;
}
}
这将使用直线而不是填充三角形渲染模型
modelBatch.begin(EnvironmentWrapper.single().getCamera());
modelBatch.render(renderables);
modelBatch.end();
谢谢这就是我要找的。。。我更喜欢有
GL\u线的那一个!但不幸的是,我不能在Gdx中设置一个常数来渲染线框。。。好吧,我想这就行了。看起来primitiveType变量已经移动到Renderable的网格部分了。因此,使用out.meshPart.primitiveType=GL20.GL\u LINE\u STRIP;似乎没有“renderable.primitiveType”。取而代之的是“renderable.meshPart.primitiveType”。我说的对吗?通过将“renderable.primitiveType”更改为“renderable.meshPart.primitiveType”,我使它工作了,但在我的多维数据集的侧面有额外的线条。@kamin“renderable.primitiveType”在撰写本文时(libGDX 1.6.4)就在那里,所以从那以后可能会更改(我可以看到他们现在已经发布了一系列更新)-我将更新答案以表明这一点,谢谢您的提及。至于额外的线-是的,它不会呈现完美的线框,因为要使用GL_LINE_STRIP,必须相应地采用模型本身。OpenGL中有用于线框的glPolygonMode(GL_FRONT,GL_LINE),但在OpenGL ES中不可用,因此GL_LINE_STRIP似乎是目前最接近的可用选项。