2012-03-02 66 views
0

與LWJGL的實現OpenGL的工作,並試圖與照明功能工作。這需要創建FloatBuffers傳遞給OpenGL。相關代碼如下:的Java FloatBuffer尺寸誤差的OpenGL

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提供了以下錯誤:在線程

異常「主」 java.lang.IllegalArgumentException異常:剩餘的緩衝區元素的個數爲0,必須至少4.因爲最多4個元素可以返回,至少有4個元素的緩衝是必需的,無論實際返回的元素的計數

不太清楚我在做什麼錯在這裏,似乎是在一個問題創建FloatBuffer。

回答

1

將溶液最終需要另一個函數調用特定於LWJGL(BufferUtils.createFloatBuffer),以及倒裝()方法。正確下面的初始化緩衝

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

翻轉()認沽後的緩衝(),或使用FloatBuffer.wrap(),這也將節省您的一些代碼行。或者,也許它需要另一個 4個插槽,所以分配8個元素。

+0

我沒有看到任何翻轉()方法的類的Java文檔...裹不工作,這給了我一個錯誤說我需要一個直接緩衝區......不應該需要8個緩衝區,在C相當於函數調用將大小4陣列 – 2012-03-03 01:35:40

+0

是翻轉超類中,給出了相同的直接緩衝區錯誤 – 2012-03-03 05:30:31

+0

@sol_var(1)緩衝。 flip()確實存在,再看一遍。它是繼承的。 (2)如果你真的需要一個直接的緩衝區,'allocate()'也不行,你必須使用'allocateDirect()'。這裏有點問題。 (3)沒有'FloatBuffer'的'C'等價物。我想你將不得不再看看你使用的軟件包的文檔。 – EJP 2012-03-03 09:02:40

0

使用FloatBuffers與LWJGL的想法是這樣的本地代碼可以直接使用有緩衝區,爲了使其正常工作,他們應該使用像這樣,

//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緩衝UTIL可能爲您完成此