虽然我确实掌握了OpenGL的基本知识,但我只是从libgdx开始.
我的问题是:为什么,拥有完全相同的代码,但只从OrthographicCamera切换到PerspectiveCamera有不再显示我的任何SpriteBatches的效果?
这是我使用的代码:
create()方法:
public void create() {
textureMesh = new Texture(Gdx.files.internal("data/texMeshTest.png"));
textureSpriteBatch = new Texture(Gdx.files.internal("data/texSpriteBatchTest.png"));
squareMesh = new Mesh(true, 4, 4,
new VertexAttribute(Usage.Position, 3, "a_position")
,new VertexAttribute(Usage.TextureCoordinates, 2, "a_texCoords")
);
squareMesh.setVertices(new float[] {
squareXInitial, squareYInitial, squareZInitial, 0,1, //lower left
squareXInitial+squareSize, squareYInitial, squareZInitial, 1,1, //lower right
squareXInitial, squareYInitial+squareSize, squareZInitial, 0,0, //upper left
squareXInitial+squareSize, squareYInitial+squareSize, squareZInitial,1,0}); //upper right
squareMesh.setIndices(new short[] { 0, 1, 2, 3});
spriteBatch = new SpriteBatch();
}
Run Code Online (Sandbox Code Playgroud)
和render()方法:
public void render() {
GLCommon gl = Gdx.gl;
camera.update();
camera.apply(Gdx.gl10); …Run Code Online (Sandbox Code Playgroud) 我开始使用libgdx.我在trunk(StillModelViewerGL20.java)中打开了示例模型加载器.在源代码中,我在render回调中看到了这段代码:
batch.begin();
font.draw(batch, "fps: " + Gdx.graphics.getFramesPerSecond(), 20, 30);
batch.end();
Run Code Online (Sandbox Code Playgroud)
但我在屏幕上看不到任何文字.在此示例中是否需要修复以查看文本?
我试图在屏幕上放一个立方体并点亮它.我想在立方体上加一个阴影.
当我运行我的代码时,我可以看到背景图像,但没有立方体.
我很确定立方体本身是正确的,因为我设法用纯色着色器显示它.
我已经设法让着色器程序编译,但我根本看不到立方体.我不知道GLES/LibGdx是否有运行时异常的机制,但我在日志中看不到任何内容.
我在假设
我试图将我的代码削减到我认为问题所在的位置.如果您还需要查看其他内容,请询问.
shader = new ShaderProgram(
Gdx.files.internal("shaders/phongVertexShader.glsl"),
Gdx.files.internal("shaders/phongFragmentShader.glsl"));
if (!shader.isCompiled()) {
throw new IllegalStateException(shader.getLog());
}
mesh = Shapes.genCube();
mesh.getVertexAttribute(Usage.Position).alias = "a_position";
mesh.getVertexAttribute(Usage.Normal).alias = "a_normal";
Run Code Online (Sandbox Code Playgroud)
public void onRender() {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
batch.setProjectionMatrix(camera.combined);
angle += Gdx.graphics.getDeltaTime() * 40.0f;
float aspect = Gdx.graphics.getWidth()
/ (float) Gdx.graphics.getHeight();
projection.setToProjection(1.0f, 20.0f, 60.0f, aspect);
view.idt().trn(0, 0, -2.0f);
model.setToRotation(axis, angle);
combined.set(projection).mul(view).mul(model);
Gdx.gl20.glViewport(0, 0, Gdx.graphics.getWidth(),
Gdx.graphics.getHeight());
shader.begin();
float[] light = {10, 10, 10};
shader.setUniformMatrix("mvpMatrix", combined); …Run Code Online (Sandbox Code Playgroud) 如果有一些方法可以管理Libgdx中的后退按钮?
例如在Andengine中我实现了这样:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
switch (currentScene) {
case SPLASH:
break;
case MENU:
Process.killProcess(Process.myPid());
break;
case WORLDMENU:
start(MENU);
break;
...
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道如何在这里做,因为ApplicationListener只有create,show,render ...我试过这个:
if (Gdx.input.isButtonPressed(Keys.BACK)){
new ScreenChangeTask(MyScreen.SPLASH);
}
Run Code Online (Sandbox Code Playgroud)
但它仍然关闭我的申请.
仅供参考:我class Controller extends Game和我public void setScreen (Screen screen)用来在屏幕之间切换.
我用libGDX setup ui创建了一个项目.该项目在Eclipse中运行良好但是当我在Android Studio中导入它时,android项目MainActivity.java抛出了4个异常:
java: cannot access com.badlogic.gdx.Application
class file for com.badlogic.gdx.Application not found
java: cannot find symbol
symbol: variable super
location: class com.vestrel00.nekko.MainActivity
java: cannot find symbol
symbol: method initialize(com.vestrel00.nekko.KFNekko,com.badlogic.gdx.backends.android.AndroidApplicationConfiguration)
location: class com.vestrel00.nekko.MainActivity
java: method does not override or implement a method from a supertype
Run Code Online (Sandbox Code Playgroud)
有没有人有办法解决吗?
我想画一条线,然后生成一个纹理(使用 libgdx)。我发现使用像素图从圆形、矩形和线条创建纹理很简单。但是我没有找到如何设置绘制形状的线宽。有没有可能为像素图设置线宽?
这是我到目前为止得到的代码:(我尝试绘制两个实心圆圈并将它们用线连接)
Pixmap pixmap = new Pixmap( 16, 16, Format.RGBA8888 );
pixmap.setColor(Color.BLUE);
pixmap.fillCircle(x1, y1, 10);
pixmap.fillCircle(x2, y2, 10);
pixmap.drawLine(x2, y2, x1, y1); // this line is very thin
Texture pixmaptex = new Texture( pixmap );
pixmap.dispose();
Run Code Online (Sandbox Code Playgroud) 我有一个使用LibGDX的安卓游戏.在其中,我有一些按钮用于在浏览器中打开URL:
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://myURL/"));
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
这看起来很好......
问题是我正在尝试将游戏移植到带有RoboVM的iOS上运行,并且无法弄清楚如何设置类似的东西.
使用RoboVM绑定,我假设我可能想要使用openURL()方法:
openURL (UIApplication application, NSURL url, String sourceApplication, NSObject annotation)
Run Code Online (Sandbox Code Playgroud)
但除了NSURL之外,我不知道我需要传递其他3个参数.并且无法在线找到有关如何使用它的任何示例.
我正在使用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项目过渡到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)