You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenGL绘制老虎机卷轴无内容显示问题排查求助

排查OpenGL老虎机卷轴无绘制内容的问题

你遇到的问题很典型——GL没有报错但就是看不到绘制内容,这种情况通常是数据没有正确传递给OpenGL或者状态配置有遗漏,结合你的代码,我整理了几个关键排查点:

1. FloatBuffer 未重置读写位置(最可能的原因)

你在向vfb、tfb、nfb写入数据后,直接把它们传给了glVertexPointer等方法,但FloatBuffer的put()操作会把内部的position指针往后移动。OpenGL读取缓冲区时是从当前position开始的,这时候指针已经在数据末尾,相当于读取空数据,自然不会有任何绘制。

解决方法:在调用gl*Pointer之前,对每个缓冲区调用rewind(),把position重置到0:

vfb.rewind();
tfb.rewind();
nfb.rewind();

gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, tfb);
gl.glNormalPointer(GL10.GL_FLOAT, 0, nfb);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vfb);

2. 缓冲区分配大小错误

你的getFloatBuffer方法里,ByteBuffer.allocateDirect(numFloats)是按字节分配内存的,但每个float占4字节,这样分配的缓冲区实际只能容纳numFloats / 4个float,会导致数据溢出(虽然没触发GL错误,但数据已经损坏)。

修正这个方法:

static FloatBuffer getFloatBuffer(int numFloats) {
    // 每个float占4字节,所以总字节数是numFloats * 4
    ByteBuffer buffer = ByteBuffer.allocateDirect(numFloats * 4);
    buffer.order(ByteOrder.nativeOrder());
    FloatBuffer newFloatBuffer = buffer.asFloatBuffer();
    return newFloatBuffer;
}

另外,你每次循环需要写入的float数量:每个四边形需要4个顶点(3个float/顶点)、4组纹理坐标(2个float/组)、4组法线(3个float/组),总共是4*3 + 4*2 +4*3 = 32个float,传100是足够的,但分配逻辑必须先修正。

3. 客户端状态未正确启用

你注释掉了纹理坐标和法线的客户端状态启用代码:

//gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
//gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);

虽然顶点数组启用了,但如果后续要使用纹理或法线,必须启用对应的客户端状态。如果你的卷轴需要纹理显示,一定要取消这两行的注释;如果暂时不需要纹理,可以去掉glTexCoordPointer的调用,避免不必要的状态设置。

4. 绘制模式与顶点顺序验证

你使用GL_TRIANGLE_FAN绘制4个顶点,需要确保顶点是按顺时针或逆时针的顺序排列的,否则可能被背面剔除(如果启用了glEnable(GL_CULL_FACE))。可以先临时禁用背面剔除来排除这个问题:

gl.glDisable(GL10.GL_CULL_FACE);

5. 视图矩阵与投影矩阵检查

如果前面的问题都修复了还是看不到内容,要检查你的视图和投影矩阵是否正确设置——比如相机是否对着卷轴的位置,投影是否能包含卷轴的范围。可以先把卷轴放在原点附近,用正交投影测试:

gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(-1, 1, -1, 1, -10, 10); // 简单的正交投影
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();

按照上面的步骤逐一排查,应该能解决无绘制的问题。

内容的提问来源于stack exchange,提问作者Mike Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 21:02:38