我正在编写一个使用GL10的3D游戏,但我希望该应用程序支持GL11或GL20(如果可用).支持所有3个的最佳设计是什么?或者这是一个傻瓜的差事,我应该专注于支持一个版本?
我目前的想法是将render()函数拆分为renderGL10,renderGL11,renderGL20,并根据可用的GL实例调用相应的渲染函数.每个渲染函数内部都是渲染GL版本的正确方法; GL10和GL11可能会有重叠.这是处理我的问题的合适方式还是有更好的方法?
public render(){
if (Gdx.graphics.isGL20Available()){
renderGL20();
} else if (Gdx.graphics.isGL11Available()){
renderGL11();
} else {
renderGL10();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:解决方案:如果gl1.x可用,gl10也可用(并且Gdx.gl10不为空).因此,我的渲染代码通常应该如下构造:
public render(){
// Use Gdx.gl for any gl calls common to all versions
if (Gdx.graphics.isGL20Available()){
// Use Gdx.GL20 for all gl calls
} else {
if (Gdx.graphics.isGL11Available()){
// Use Gdx.gl11 for any gl11 call not supported by gl10
}
// Use Gdx.gl10 for all gl calls
}
}
Run Code Online (Sandbox Code Playgroud) 我试图让一个物体出现在最后一个人触摸的地方.但是,当我尝试这样做时,它出现在错误的地方.我假设这是因为输入返回的坐标与显示坐标不同,我的代码如下:
public class Core implements ApplicationListener, InputProcessor
{ //Has to be here otherwise the code formatting becomes buggy
private Mesh squareMesh;
private PerspectiveCamera camera;
private Texture texture;
private SpriteBatch spriteBatch;
Sprite sprite;
float moveX = 0;
private final Matrix4 viewMatrix = new Matrix4();
private final Matrix4 transformMatrix = new Matrix4();
@Override
public void create()
{
Gdx.input.setInputProcessor(this);
texture = new Texture(Gdx.files.internal("door.png"));
spriteBatch = new SpriteBatch();
sprite = new Sprite(texture);
sprite.setPosition(0, 0);
viewMatrix.setToOrtho2D(0, 0, 480, 320);
float x = 0;
float y …Run Code Online (Sandbox Code Playgroud) 我正在使用LibGDX框架处理绘图应用程序,我正在使用他们的FrameBuffer类将用户绘制的内容合并到实体纹理上,这就是他们所看到的绘图.这方面工作得很好,但是,用户可以绘制的区域并不总是大小相同,并且我无法在除整个窗口之外的分辨率上正确显示它.
我已经对此进行了非常广泛的测试,看起来似乎正在发生的事情是FrameBuffer以与窗口本身相同的分辨率创建纹理,然后简单地拉伸或缩小它以适应它原本应该在的实际区域,这是对于任何比窗口更大或更小的绘图而言,这是一种非常不愉快的效果.
我已经在我的过程中的每一步都证实了我自己从未做过任何这样的伸展,并且正确地绘制了所有内容以及正确的尺寸和位置.我也查看了FrameBuffer类本身试图找到答案,但奇怪的是也没有找到任何东西,但是,考虑到我所做的所有测试,它似乎是这个问题的唯一可能的地方以某种方式创造.
我完全没有想法,花了相当多的时间来解决这个问题.
我一直试图在Libgdx项目中做一些模板.到目前为止,我只能模板化多边形(插图后的代码).
问题:我如何在OpenGL ES 2.0中模板化非多边形形状?(即我不希望将透明像素绘制到模板缓冲区)
如何在不使用GL_ALPHA_TEST的情况下实现这一目标(因为OpenGL ES 2.0不允许)?
非常感谢任何帮助或指示,并提前感谢.
编辑:如果您能提供一些代码示例以供理解,那将非常有用.
请考虑下图:

这是渲染代码:
@Override
public void render(float delta) {
Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_STENCIL_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT );
stage.act();
stage.draw();
Gdx.gl20.glColorMask(false, false, false, true);
Gdx.gl20.glDepthMask(false);
Gdx.gl20.glClearStencil(0x0);
Gdx.gl20.glEnable(GL20.GL_STENCIL_TEST);
Gdx.gl20.glStencilFunc(GL20.GL_ALWAYS, 0x1, 0x1);
Gdx.gl20.glStencilOp(GL20.GL_KEEP, GL20.GL_KEEP, GL20.GL_REPLACE);
batch.begin();
batch.draw(heart, 0, i+50);
batch.end();
Gdx.gl20.glColorMask(true, true, true, true);
Gdx.gl20.glDepthMask(true);
Gdx.gl20.glStencilFunc(GL20.GL_NOTEQUAL, 0x1, 0x1);
Gdx.gl20.glStencilOp(GL20.GL_KEEP, GL20.GL_KEEP, GL20.GL_KEEP);
batch.begin();
batch.draw(heart, 0, i);
batch.end();
Gdx.gl20.glDisable(GL20.GL_STENCIL_TEST);
}
Run Code Online (Sandbox Code Playgroud) 我是libGDX的新手,我不明白为什么在gdx-setup-ui中需要Android模块?
libGDX不是用于制作桌面游戏吗?有没有办法创建一个避免Android的桌面项目(只有核心+桌面)?
我正在使用这些说明为libgdx项目过渡到maven 。但是我的项目需要freetype,我对如何为其添加依赖项感到困惑:
Caused by: com.badlogic.gdx.utils.GdxRuntimeException: Unable to read file for extraction: libgdx-freetype64.so
at com.badlogic.gdx.utils.SharedLibraryLoader.readFile(SharedLibraryLoader.java:119)
at com.badlogic.gdx.utils.SharedLibraryLoader.loadFile(SharedLibraryLoader.java:231)
at com.badlogic.gdx.utils.SharedLibraryLoader.load(SharedLibraryLoader.java:108)
... 7 more
Run Code Online (Sandbox Code Playgroud)
这是我的desktop / pom.xml:
<dependencies>
<dependency>
<groupId>com.autonomousgames.starcycle</groupId>
<artifactId>starcycle-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.badlogicgames.gdx</groupId>
<artifactId>gdx</artifactId>
<version>${gdx.version}</version>
</dependency>
<dependency>
<groupId>com.badlogicgames.gdx</groupId>
<artifactId>gdx-freetype-platform</artifactId>
<version>${gdx.version}</version>
</dependency>
<dependency>
<groupId>com.badlogicgames.gdx</groupId>
<artifactId>gdx-freetype</artifactId>
<version>${gdx.version}</version>
</dependency>
<dependency>
<groupId>com.badlogicgames.gdx</groupId>
<artifactId>gdx-backend-lwjgl</artifactId>
<version>${gdx.version}</version>
</dependency>
<dependency>
<groupId>com.badlogicgames.gdx</groupId>
<artifactId>gdx-platform</artifactId>
<version>${gdx.version}</version>
<classifier>natives-desktop</classifier>
</dependency>
Run Code Online (Sandbox Code Playgroud)
编辑:并且当我运行“ mvn clean install -Pdesktop”时,我得到以下信息:
main:
[java] Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: java.lang.ExceptionInInitializerError
[java] at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:120)
[java] Caused by: java.lang.ExceptionInInitializerError
[java] …Run Code Online (Sandbox Code Playgroud) 要在屏幕上渲染绘图对象如何计算我不知道的屏幕比例,还指定移动和电脑的比率计算是不同的.
我想问这个问题,因为我对世界时间步问题有疑问.
当试图在舞台上放置一个简单的ImageButton时,它似乎没有检测到点击.
ImageButton btnStart = new ImageButton(ButtonArt.UP, ButtonArt.DOWN));
// btnStart.setClickListener(new ClickListener() {
// @Override
// public void click(Actor a, float arg1, float arg2) {
// a.visible = false;
// }
// });
stage.addActor(btnStart);
Run Code Online (Sandbox Code Playgroud)
ButtonArt.UP和ButtonArt.DOWN是每个州的TextureRegions.现在,当我点击按钮时,它不会改变状态!我也尝试了上面的ClickListener(用于测试),但它似乎也没有用.
在我的render方法中,我只调用stage.act()和stage.render().我也尝试在我的渲染方法中使用SpriteBatch绘制TextureRegions,它们实际上是不同的纹理.
难道我做错了什么?
我真的坚持这个我可以成功地发现碰撞,但我不能让两个身体参与碰撞.
这是我的ContactListener
world.setContactListener(listener);
listener = new ContactListener() {
@Override
public void preSolve(Contact contact, Manifold oldManifold) {
}
@Override
public void postSolve(Contact contact, ContactImpulse impulse) {
}
//called when two fixtures cease to touch
@Override
public void endContact(Contact contact) {
Fixture fixtureA = contact.getFixtureA();
Fixture fixtureB = contact.getFixtureB();
Gdx.app.log("beginContact", "between" + fixtureA.toString() + "and" + fixtureB.toString());
}
//called when two fixtures begin to touch
@Override
public void beginContact(Contact contact) {
Fixture fixtureA = contact.getFixtureA();
Fixture fixtureB = contact.getFixtureB();
Gdx.app.log("beginContact", "between" …Run Code Online (Sandbox Code Playgroud) 我试图使用Action FadeOut消除一个Actor.但是,我发现没有任何动作对我的对象起作用.我的类的层次结构如下:
Actor -> MoveableObject -> Knight
Stage -> KnightGroup (Group) -> Knight
Run Code Online (Sandbox Code Playgroud)
我的骑士演员的动作根本不起作用.但是,我的KnightGroup小组的操作有效.这是我的骑士的代码:
public class Knight extends Players {
public Knight() {
setWidth(96);
setHeight(96);
setPosition(100, 90);
//Doesn't work
AlphaAction action = new AlphaAction();
action.setAlpha(0f);
action.setDuration(1f);
addAction(action);
//Doesn't work
addAction(fadeOut(1f));
addAction(Actions.scaleBy(1f, 1f));
}
@Override
public void act(float delta){
super.act(delta);
}
@Override
public void draw(Batch batch, float parentAlpha) {
batch.setColor(getColor().r, getColor().g, getColor().b, getColor().a);
batch.draw(animation[currentState], getX(), getY(), getWidth(), getHeight());
}
}
Run Code Online (Sandbox Code Playgroud)
我不能为我的生活找出问题所在.在行动MoveableObject(骑士的母公司)也不起作用.我最好的猜测是,在包装的演员Group将render在actions这些演员无效.这KnightGroup是我的代码中非常重要的一部分,我不得不做很多重构才能把它拿出来.别人可以对这个问题有所了解吗?