Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java(endian)中呈现GL_SHORT?_Java_Opengl_Endianness_Short - Fatal编程技术网

如何在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);