如何在java(endian)中呈现GL_SHORT?
我正在使用如何在java(endian)中呈现GL_SHORT?,java,opengl,endianness,short,Java,Opengl,Endianness,Short,我正在使用com.jogamp.opengl.GL2在屏幕外渲染短裤的3d纹理,然后通过glReadPixels解析结果。当我的3d纹理值都为正值时,结果就是我所期望的。但是,当我有负值时,我无法理解如何配置opengl以给出正确的结果。我尝试了glPixelStorei(GL2.GL\u PACK\u SWAP\u字节,1)和glPixelStorei(GL2.GL\u解包\u交换\u字节,1)。我已经尝试了GL_PACK/UNPACK_SWAP_字节的所有4种组合,但所有结果都不正确 数据的
com.jogamp.opengl.GL2
在屏幕外渲染短裤的3d纹理,然后通过glReadPixels
解析结果。当我的3d纹理值都为正值时,结果就是我所期望的。但是,当我有负值时,我无法理解如何配置opengl以给出正确的结果。我尝试了glPixelStorei(GL2.GL\u PACK\u SWAP\u字节,1)代码>和glPixelStorei(GL2.GL\u解包\u交换\u字节,1)代码>。我已经尝试了GL_PACK/UNPACK_SWAP_字节的所有4种组合,但所有结果都不正确
数据的范围从-1024到+1024(或在该范围附近),因此,作为替代方案,我在(+4096然后-4096表示良好的度量)之后进行规范化和非规范化。这给了我正确的结果,但感觉真的很糟糕。是否有正确的方法通过java呈现和解析有符号16位
以下是基本代码:
private int upload3DTexture(GL2 gl2, ShortBuffer data)
{
int texName[] = new int[1];
gl2.glPixelStorei(GL2.GL_PACK_ALIGNMENT, 2);
gl2.glPixelStorei(GL2.GL_UNPACK_ALIGNMENT, 2);
gl2.glPixelStorei(GL2.GL_PACK_SWAP_BYTES, 1);
gl2.glPixelStorei(GL2.GL_UNPACK_SWAP_BYTES, 1);
gl2.glGenTextures(1, texName, 0);
gl2.glEnable(GL2.GL_TEXTURE_3D);
gl2.glBindTexture(GL2.GL_TEXTURE_3D, texName[0]);
gl2.glTexParameteri(GL2.GL_TEXTURE_3D, GL2.GL_TEXTURE_WRAP_S, GL2.GL_CLAMP_TO_BORDER);
gl2.glTexParameteri(GL2.GL_TEXTURE_3D, GL2.GL_TEXTURE_WRAP_T, GL2.GL_CLAMP_TO_BORDER);
gl2.glTexParameteri(GL2.GL_TEXTURE_3D, GL2.GL_TEXTURE_WRAP_R, GL2.GL_CLAMP_TO_BORDER);
gl2.glTexParameteri(GL2.GL_TEXTURE_3D, GL2.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);
gl2.glTexParameteri(GL2.GL_TEXTURE_3D, GL2.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);
gl2.glTexEnvi(GL2.GL_TEXTURE_3D, GL2.GL_TEXTURE_ENV_MODE, GL2.GL_MODULATE);
((java.nio.Buffer)data).rewind();
gl2.glTexImage3D(GL2.GL_TEXTURE_3D, 0, GL2.GL_R16, nCols, nRows, nSlices, 0, GL2.GL_RED, GL.GL_SHORT, data);
return texName[0];
}
private int upload3DTexture(GL2 gl2, ShortBuffer data)
{
int texName[] = new int[1];
gl2.glPixelStorei(GL2.GL_PACK_ALIGNMENT, 2);
gl2.glPixelStorei(GL2.GL_UNPACK_ALIGNMENT, 2);
gl2.glPixelStorei(GL2.GL_PACK_SWAP_BYTES, 1);
gl2.glPixelStorei(GL2.GL_UNPACK_SWAP_BYTES, 1);
gl2.glGenTextures(1, texName, 0);
gl2.glEnable(GL2.GL_TEXTURE_3D);
gl2.glBindTexture(GL2.GL_TEXTURE_3D, texName[0]);
gl2.glTexParameteri(GL2.GL_TEXTURE_3D, GL2.GL_TEXTURE_WRAP_S, GL2.GL_CLAMP_TO_BORDER);
gl2.glTexParameteri(GL2.GL_TEXTURE_3D, GL2.GL_TEXTURE_WRAP_T, GL2.GL_CLAMP_TO_BORDER);
gl2.glTexParameteri(GL2.GL_TEXTURE_3D, GL2.GL_TEXTURE_WRAP_R, GL2.GL_CLAMP_TO_BORDER);
gl2.glTexParameteri(GL2.GL_TEXTURE_3D, GL2.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);
gl2.glTexParameteri(GL2.GL_TEXTURE_3D, GL2.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);
gl2.glTexEnvi(GL2.GL_TEXTURE_3D, GL2.GL_TEXTURE_ENV_MODE, GL2.GL_MODULATE);
((java.nio.Buffer)data).rewind();
gl2.glTexImage3D(GL2.GL_TEXTURE_3D, 0, GL2.GL_R16, nCols, nRows, nSlices, 0, GL2.GL_RED, GL.GL_SHORT, data);
return texName[0];
}
private short[] renderAndResolve() {
short[] volume= new short[64];
short index = 0;
for (int z = 0; z < 4; z++) {
for (int y = 0; y < 4; y++) {
for (int x = 0; x < 4; x++) {
volume[index] = (short)(-100*z + y);
index++;
}
}
}
ShortBuffer shortBuffer = ShortBuffer.wrap(volume);
texID = upload3DTexture(gl2, shortBuffer);
display();
ShortBuffer resultBuffer = ShortBuffer.allocate(nSlices * nRows);
resolve(resultBuffer, 4, 4);
return resolve.array();
}
private void resolveDisplay(ShortBuffer slice, int w, int h)
{
GL2 gl2 = drawable.getGL().getGL2(); // The object that contains all the OpenGL methods.
fbo.bind(gl2);
gl2.glReadBuffer(GL2.GL_COLOR_ATTACHMENT0);
((java.nio.Buffer)slice).rewind();
int xd = (frameWidth - w)/2;
int yd = (frameHeight - h)/2;
gl2.glReadPixels(xd, yd, w, h, GL2.GL_RED, GL2.GL_SHORT, slice);
fbo.unbind(gl2);
((java.nio.Buffer)slice).rewind();
}
private int upload3DTexture(GL2 GL2,短缓冲区数据)
{
int-texName[]=新的int[1];
gl2.glPixelStorei(gl2.GL_-PACK_-ALIGNMENT,2);
gl2.glPixelStorei(gl2.GLU解包对齐,2);
gl2.glPixelStorei(gl2.GL\u PACK\u SWAP\u字节,1);
gl2.glPixelStorei(gl2.GL_解包_交换_字节,1);
gl2.glGenTextures(1,texName,0);
gl2.glEnable(gl2.GL_纹理_3D);
gl2.glBindTexture(gl2.GL_TEXTURE_3D,texName[0]);
gl2.glTexParameteri(gl2.GL\u纹理\u 3D、gl2.GL\u纹理\u包裹、gl2.GL\u夹紧\u至\u边框);
gl2.glTexParameteri(gl2.GL\u纹理\u 3D、gl2.GL\u纹理\u包裹\u T、gl2.GL\u夹紧\u至\u边框);
gl2.glTexParameteri(gl2.GL\u纹理\u 3D、gl2.GL\u纹理\u包裹\u R、gl2.GL\u夹紧\u至\u边框);
gl2.glTexParameteri(gl2.GL\u纹理\u 3D,gl2.GL\u纹理\u MAG\u过滤器,GL.GL\u线性);
gl2.glTexParameteri(gl2.GL\u纹理\u 3D,gl2.GL\u纹理\u最小\u过滤器,GL.GL\u线性);
gl2.glTexEnvi(gl2.GL_纹理_3D,gl2.GL_纹理_环境_模式,gl2.GL_调制);
((java.nio.Buffer)数据);
gl2.glTexImage3D(gl2.GL_纹理_3D,0,gl2.GL_R16,nCols,nRows,nSlices,0,gl2.GL_红色,GL.GL_短,数据);
返回texName[0];
}
私有int upload3DTexture(GL2 GL2,短缓冲区数据)
{
int-texName[]=新的int[1];
gl2.glPixelStorei(gl2.GL_-PACK_-ALIGNMENT,2);
gl2.glPixelStorei(gl2.GLU解包对齐,2);
gl2.glPixelStorei(gl2.GL\u PACK\u SWAP\u字节,1);
gl2.glPixelStorei(gl2.GL_解包_交换_字节,1);
gl2.glGenTextures(1,texName,0);
gl2.glEnable(gl2.GL_纹理_3D);
gl2.glBindTexture(gl2.GL_TEXTURE_3D,texName[0]);
gl2.glTexParameteri(gl2.GL\u纹理\u 3D、gl2.GL\u纹理\u包裹、gl2.GL\u夹紧\u至\u边框);
gl2.glTexParameteri(gl2.GL\u纹理\u 3D、gl2.GL\u纹理\u包裹\u T、gl2.GL\u夹紧\u至\u边框);
gl2.glTexParameteri(gl2.GL\u纹理\u 3D、gl2.GL\u纹理\u包裹\u R、gl2.GL\u夹紧\u至\u边框);
gl2.glTexParameteri(gl2.GL\u纹理\u 3D,gl2.GL\u纹理\u MAG\u过滤器,GL.GL\u线性);
gl2.glTexParameteri(gl2.GL\u纹理\u 3D,gl2.GL\u纹理\u最小\u过滤器,GL.GL\u线性);
gl2.glTexEnvi(gl2.GL_纹理_3D,gl2.GL_纹理_环境_模式,gl2.GL_调制);
((java.nio.Buffer)数据);
gl2.glTexImage3D(gl2.GL_纹理_3D,0,gl2.GL_R16,nCols,nRows,nSlices,0,gl2.GL_红色,GL.GL_短,数据);
返回texName[0];
}
私有短[]renderAndResolve(){
短[]卷=新短[64];
短指数=0;
对于(intz=0;z<4;z++){
对于(int y=0;y<4;y++){
对于(int x=0;x<4;x++){
体积[指数]=(短)(-100*z+y);
索引++;
}
}
}
ShortBuffer ShortBuffer=ShortBuffer.wrap(卷);
texID=upload3DTexture(gl2,shortBuffer);
显示();
ShortBuffer resultBuffer=ShortBuffer.allocate(nSlices*nRows);
解决(结果缓冲,4,4);
返回resolve.array();
}
专用显示(短缓冲区片,整数w,整数h)
{
GL2 GL2=drawable.getGL().getGL2();//包含所有OpenGL方法的对象。
fbo.bind(gl2);
gl2.glReadBuffer(gl2.GL\u COLOR\u ATTACHMENT0);
((java.nio.Buffer)切片);
intxd=(帧宽度-w)/2;
int yd=(框架高度-h)/2;
gl2.glReadPixels(xd、yd、w、h、gl2.GL_RED、gl2.GL_SHORT、slice);
fbo解除绑定(gl2);
((java.nio.Buffer)切片);
}
该问题是由纹理的内部格式引起的
纹理图像数据存储的内部格式GL_R16
不是单一格式,而是无符号整数16位格式
我不知道你使用的是哪个OpenGL版本
桌面OpenGL提供了内部数据格式GL\u R16\u SNORM
,这是一种16位有符号整数数据格式-请参阅。
在接口中实现:
gl2.glTexImage3D(gl2.GL_纹理_3D,0,GL2GL3.GL_R16_snrom,
nCols、nRows、nSlices、0、GL2.GL_RED、GL.GL_SHORT、数据);
OpenGL ES(3.0)提供单一的8位整数格式GL\u R8\u SNORM
实现了以下接口:
gl2.glTexImage3D(gl2.GL_纹理_3D,0,GL2ES3.GL_R8_snrom,
nCols、nRows、nSlices、0、GL2.GL_RED、GL.GL_SHORT、数据);
作为替代方案,桌面OpenGL和OpenGL ES提供16浮点格式:
e、 g
gl2.glTexImage3D(gl2.GL_纹理_3D,0,gl2.GL_R16F,
nCols、nRows、nSlices、0、GL2.GL_RED、GL.GL_SHORT、数据);
gl2.glTexImage3D(GL2.GL_TEXTURE_3D, 0, GL2.GL_R16,
nCols, nRows, nSlices, 0, GL2.GL_RED, GL.GL_SHORT, data);