gpt4 book ai didi

java - 在适用于 Android 的 OpenGL ES 中使用 2D 游戏渲染图像

转载 作者:行者123 更新时间:2023-12-01 15:54:18 24 4
gpt4 key购买 nike

编辑:解决了!我犯了一个愚蠢的错误,我有一个textureId,但我忘记了它是什么时候我应该使用的textureID。

好吧,我完全意识到这是一个反复出现的问题,并且有很多教程和开源代码。但我已经尽我所能尝试了很长一段时间,但我的屏幕仍然是空白的(无论我使用 glClearColor() 设置什么颜色)。

因此,如果有人指出我做错了什么,或者更好的是一些可以渲染资源图像的工作代码,我将不胜感激。

我将在实现渲染器的类的 onDrawFrame 中展示到目前为止我所得到的内容(通过进行一些巧妙的复制粘贴)。我已经删除了一些方法之间的跳转,并将简单地按照执行顺序粘贴它。

请随意忽略我当前的代码,如果有人能给我一段有效的代码,我非常乐意重新开始。

设置:

    bitmap = BitmapFactory.decodeResource(panel.getResources(), 
R.drawable.test);
addGameComponent(new MeleeAttackComponent());

// Mapping coordinates for the vertices
float textureCoordinates[] = { 0.0f, 2.0f, //
2.0f, 2.0f, //
0.0f, 0.0f, //
2.0f, 0.0f, //
};

short[] indices = new short[] { 0, 1, 2, 1, 3, 2 };

float[] vertices = new float[] { -0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
-0.5f, 0.5f, 0.0f,
0.5f, 0.5f, 0.0f };

setIndices(indices);
setVertices(vertices);
setTextureCoordinates(textureCoordinates);

protected void setVertices(float[] vertices) {
// a float is 4 bytes, therefore we multiply the number if
// vertices with 4.
ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
vbb.order(ByteOrder.nativeOrder());
mVerticesBuffer = vbb.asFloatBuffer();
mVerticesBuffer.put(vertices);
mVerticesBuffer.position(0);
}


protected void setIndices(short[] indices) {
// short is 2 bytes, therefore we multiply the number if
// vertices with 2.
ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2);
ibb.order(ByteOrder.nativeOrder());
mIndicesBuffer = ibb.asShortBuffer();
mIndicesBuffer.put(indices);
mIndicesBuffer.position(0);
mNumOfIndices = indices.length;
}


protected void setTextureCoordinates(float[] textureCoords) {

// float is 4 bytes, therefore we multiply the number of
// vertices with 4.
ByteBuffer byteBuf = ByteBuffer
.allocateDirect(textureCoords.length * 4);
byteBuf.order(ByteOrder.nativeOrder());
mTextureBuffer = byteBuf.asFloatBuffer();
mTextureBuffer.put(textureCoords);
mTextureBuffer.position(0);
}

//onDrawFrame(GL10 gl)

    gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glLoadIdentity();
gl.glTranslatef(0, 0, -4);

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
// Specifies the location and data format of an array of vertex
// coordinates to use when rendering.
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVerticesBuffer);

if(shoudlLoadTexture){
loadGLTextures(gl);
shoudlLoadTexture = false;
}

if (mTextureId != -1 && mTextureBuffer != null) {
gl.glEnable(GL10.GL_TEXTURE_2D);
// Enable the texture state
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

// Point to our buffers
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTextureBuffer);
gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureId);
}

gl.glTranslatef(posX, posY, 0);
// Point out the where the color buffer is.
gl.glDrawElements(GL10.GL_TRIANGLES, mNumOfIndices,
GL10.GL_UNSIGNED_SHORT, mIndicesBuffer);
// Disable the vertices buffer.
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

if (mTextureId != -1 && mTextureBuffer != null) {
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
}


private void loadGLTextures(GL10 gl) {

int[] textures = new int[1];
gl.glGenTextures(1, textures, 0);
mTextureID = textures[0];

gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureID);

gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);

gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);
gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE);

GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

}

它不会崩溃,没有异常(exception),只是一个带有颜色的空白屏幕。我已经在那里打印了一些东西,所以我很确定它已经全部执行了。

我知道仅仅粘贴代码并不是最佳选择,但目前,我只想能够做我能用 Canvas 做的事情:)

非常感谢

最佳答案

如果您获得背景颜色,则意味着您的窗口已正确设置。 OpenGL 连接到屏幕的该区域。

但是,OpenGL 会剪裁到近剪裁平面和远剪裁平面,确保对象不会与相机交叉或相交(这在数学和逻辑上都没有意义),并且不会出现太远的对象。因此,如果您没有正确设置模型 View 和投影,则所有几何图形可能都会被裁剪。

模型 View 用于从世界映射到眼睛空间。从眼睛空间到屏幕空间的投影映射。因此,典型的应用程序使用前者来定位场景内的对象,并将场景相对于相机定位,然后后者处理相机是否以透视方式观看,有多少世界单位产生多少屏幕单位等。

如果你看一下例子like this one ,特别是 onSurfaceChanged,您将看到一个相机固定在原点的透视投影示例。

因为相机位于 (0, 0, 0),所以像代码那样将几何图形保留在 z = 0 上将导致其被剪裁。在该示例代码中,他们将近剪裁平面设置为 z = 0.1,因此在现有代码中您可以更改:

gl.glTranslatef(posX, posY, 0);

致:

gl.glTranslatef(posX, posY, -1.0);

将几何图形向后推足够远以显示在屏幕上。

关于java - 在适用于 Android 的 OpenGL ES 中使用 2D 游戏渲染图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5395538/

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