首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java FloatBuffer大小错误OpenGL

Java FloatBuffer大小错误OpenGL
EN

Stack Overflow用户
提问于 2012-03-03 07:20:14
回答 3查看 4.5K关注 0票数 0

使用LWJGL的OpenGL实现,并尝试使用照明功能。这需要创建要传递给OpenGL的FloatBuffers。相关代码如下:

代码语言:javascript
复制
GL11.glClearColor(0,0,0,0);

float[] ambientLight={(float).3,(float).5,(float).8,1};
FloatBuffer ambientLightB = FloatBuffer.allocate(4);
ambientLightB.put(ambientLight);

float[] diffuseLight={(float).25,(float).25,(float).25,1};
FloatBuffer diffuseLightB = FloatBuffer.allocate(4);
diffuseLightB.put(diffuseLight);

float[] lightPosition={0,0,1,1};
FloatBuffer lightPositionB = FloatBuffer.allocate(4);
lightPositionB.put(lightPosition);

float[] matAmbient={1,1,1,1};
FloatBuffer matAmbientB = FloatBuffer.allocate(4);
matAmbientB.put(matAmbient);

float[] matDiff={1,1,1,1};
FloatBuffer matDiffB = FloatBuffer.allocate(4);
matDiffB.put(matDiff);

GL11.glShadeModel(GL11.GL_SMOOTH);
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glEnable(GL11.GL_CULL_FACE);
GL11.glFrontFace(GL11.GL_CCW);
GL11.glEnable(GL11.GL_LIGHTING);

GL11.glMaterial(GL11.GL_FRONT,GL11.GL_AMBIENT,matAmbientB);
GL11.glMaterial(GL11.GL_FRONT, GL11.GL_DIFFUSE,matDiffB);
GL11.glLight(GL11.GL_LIGHT0,GL11.GL_AMBIENT,ambientLightB);
GL11.glLight(GL11.GL_LIGHT0,GL11.GL_DIFFUSE,diffuseLightB);
GL11.glLight(GL11.GL_LIGHT0,GL11.GL_POSITION,lightPositionB);
GL11.glEnable(GL11.GL_LIGHT0);

我第一次调用glMaterial时出现以下错误:

线程main java.lang.IllegalArgumentException异常:剩余缓冲区元素数为0,必须至少为4。由于最多只能返回4个元素,因此无论实际返回的元素数如何,都需要至少包含4个元素的缓冲区

不太确定我在这里做错了什么,似乎是在创建FloatBuffer时出现了问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-03 22:51:06

解决方案最终需要另一个特定于LWJGL (BufferUtils.createFloatBuffer)的函数调用,以及flip()方法。下面的命令正确初始化了缓冲区

代码语言:javascript
复制
float[] matAmbient={1,1,1,1};
FloatBuffer matAmbientB = BufferUtils.createFloatBuffer(4);
matAmbientB.put(matAmbient);
matAmbientB.flip();
票数 1
EN

Stack Overflow用户

发布于 2012-03-03 09:21:11

在put()之后翻转缓冲区,或者使用FloatBuffer.wrap(),这也可以节省一些代码行。或者它可能需要另外4个插槽,所以分配8个元素。

票数 1
EN

Stack Overflow用户

发布于 2012-03-05 18:15:55

在LWJGL中使用FloatBuffers的想法是为了让本机代码可以直接使用这些缓冲区,为了让它们正常工作,应该这样使用它们。

代码语言:javascript
复制
//Create a directly allocated buffer in bytes (16 = 4 Floats * size of float in bytes)
ByteBuffer bytes = ByteBuffer.allocateDirect(16).order(ByteOrder.nativeOrder());
FloatBuffer fb = bytes.asFloatBuffer();
fb.put(...);
fb.rewind(); //Moves the internal buffer pointer back to the start for the next thing to read from it

ByteOrder.nativeOrder()将确保无论您的系统使用大端还是小端,都可以将其正确地从java转换为本机代码。(参见http://en.wikipedia.org/wiki/Endianness)

LWJGL buffer util可能会为您完成此操作

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9541752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档