好的,我完全清楚这是一个反复出现的问题,并且有很多教程和开源代码。但是我已经在这里尝试了很长一段时间,而且我的屏幕仍然是空白的(我使用glClearColor()设置的任何颜色)。
所以,我会感谢你指出我做错了什么,甚至更好,一些能够呈现资源图像的工作代码。
我将在实现Renderer的类的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);
}
它没有崩溃,没有例外,只是一个带有颜色的空白屏幕。我已经在那里打印了东西,所以我很确定它已全部被执行了。
我知道只粘贴代码并不是最佳选择,但此刻,我只是希望能够做到我用canvas做的事情:)
非常感谢
答案 0 :(得分:1)
如果您获得背景颜色,则表示您的窗口已正确设置。 OpenGL连接到屏幕的该区域。
然而,OpenGL会剪切到近处和远处的剪裁平面,确保物体不会穿过或交叉相机(数学上和逻辑上都没有意义),并且太远的物体不会出现。因此,如果您没有正确设置模型视图和投影,则可能会剪切所有几何体。
Modelview用于从世界到眼睛空间进行映射。从眼睛空间到屏幕空间的投影图。因此,典型的应用程序使用前者来定位场景中的对象,并相对于相机定位场景,然后后者处理相机是否以透视方式查看,有多少世界单位制作多少个屏幕单位等。 / p>
如果您查看示例like this one,尤其是onSurfaceChanged
,您会看到一个透视投影示例,其中相机固定在原点。
由于相机位于(0,0,0),因此您的几何图形在z = 0处会保留,因为您的代码会将其剪裁掉。在该示例代码中,他们将近剪裁平面设置为z = 0.1,因此在现有代码中您可以更改:
gl.glTranslatef(posX, posY, 0);
要:
gl.glTranslatef(posX, posY, -1.0);
将几何体推回到足够远的位置以显示在屏幕上。