Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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
opengl java加载png纹理无法正常工作_Java_Opengl_Textures - Fatal编程技术网

opengl java加载png纹理无法正常工作

opengl java加载png纹理无法正常工作,java,opengl,textures,Java,Opengl,Textures,我试图加载一个png文件作为纹理,但是,即使我没有任何错误,我也无法看到纹理。我唯一得到的是一种颜色的正方形。我已经寻找了一些例子,但我不知道我犯了什么错误。代码如下: final Image image = SWTImageFactory.getImage(ImageFactory.CROSS_SYMBOL_IMAGE); final ImageData imageData = image.getImageData(); ByteBuffer

我试图加载一个png文件作为纹理,但是,即使我没有任何错误,我也无法看到纹理。我唯一得到的是一种颜色的正方形。我已经寻找了一些例子,但我不知道我犯了什么错误。代码如下:

        final Image image = SWTImageFactory.getImage(ImageFactory.CROSS_SYMBOL_IMAGE);
        final ImageData imageData = image.getImageData();

        ByteBuffer buffer = ByteBuffer.allocate(4*imageData.width * imageData.height);
        int p, r, g, b, a;

        for (int y = 0; y<imageData.height; y++) {
            for (int x = 0; x < imageData.width; x++) {

                p =  imageData.getPixel(x, y);
                a = (p >> 24) & 0xFF;  // get pixel bytes in ARGB order
                r = (p >> 16) & 0xFF;
                g = (p >> 8) & 0xFF;
                b = (p >> 0) & 0xFF;

                buffer.put((byte)r);   // fill in bytes in RGBA order
                buffer.put((byte)g);
                buffer.put((byte)b);
                buffer.put((byte)a); 
             }
        }

        buffer.rewind();
        gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, 4,imageData.width, imageData.height,0,
                        GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, buffer);

        gl.glEnable(GL.GL_TEXTURE_2D);
        int [] textures = new int [1];
        gl.glGenTextures(1, textures, 0); 

        gl.glBindTexture(GL.GL_TEXTURE_2D, textures[0]);

        gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_REPEAT);
        gl.glTexParameteri (GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_REPEAT);
        gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER,GL.GL_LINEAR);
        gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER,GL.GL_LINEAR);

        gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_MODULATE);  

        gl.glBegin(GL.GL_QUADS);

        gl.glTexCoord2f(0.0f, 0.0f);
        gl.glVertex3f(100.0f, 100.0f, 0.0f);

        gl.glTexCoord2f(0.0f, 1.0f);
        gl.glVertex3f(100.0f, 200.0f, 0.0f);

        gl.glTexCoord2f(1.0f, 1.0f);
        gl.glVertex3f(200.0f, 200.0f, 0.0f);

        gl.glTexCoord2f(1.0f, 0.0f);
        gl.glVertex3f(200.0f, 100.0f, 0.0f);

        gl.glEnd();
        gl.glDisable(GL.GL_TEXTURE_2D);
final Image=SWTImageFactory.getImage(ImageFactory.CROSS\u SYMBOL\u Image);
final ImageData ImageData=image.getImageData();
ByteBuffer buffer=ByteBuffer.allocate(4*imageData.width*imageData.height);
int p,r,g,b,a;
对于(int y=0;y>24)&0xFF;//以ARGB顺序获取像素字节
r=(p>>16)和0xFF;
g=(p>>8)&0xFF;
b=(p>>0)和0xFF;
buffer.put((字节)r);//按RGBA顺序填写字节
buffer.put((字节)g);
buffer.put((字节)b);
buffer.put((字节)a);
}
}
buffer.rewind();
gl.glTexImage2D(gl.gl_纹理_2D,0,4,imageData.width,imageData.height,0,
GL.GL_RGBA,GL.GL_无符号字节,缓冲区);
gl.glEnable(gl.gl\U纹理\U 2D);
int[]纹理=新的int[1];
gl.glGenTextures(1,纹理,0);
gl.glBindTexture(gl.gl_纹理_2D,纹理[0]);
gl.glTexParameteri(gl.gl\u纹理\u 2D、gl.gl\u纹理\u包裹、gl.gl\u重复);
gl.glTexParameteri(gl.gl\u纹理\u 2D、gl.gl\u纹理\u包裹、gl.gl\u重复);
gl.glTexParameteri(gl.gl\u纹理\u 2D,gl.gl\u纹理\u MAG\u过滤器,gl.gl\u线性);
gl.glTexParameteri(gl.gl\u纹理\u 2D,gl.gl\u纹理\u最小\u过滤器,gl.gl\u线性);
gl.glTexEnvf(gl.gl_纹理_环境,gl.gl_纹理_环境模式,gl.gl_调制);
gl.glBegin(gl.gl_QUADS);
gl.glTexCoord2f(0.0f,0.0f);
gl.glVertex3f(100.0f,100.0f,0.0f);
gl.glTexCoord2f(0.0f,1.0f);
gl.glVertex3f(100.0f、200.0f、0.0f);
gl.glTexCoord2f(1.0f,1.0f);
gl.glVertex3f(200.0f,200.0f,0.0f);
gl.glTexCoord2f(1.0f,0.0f);
gl.glVertex3f(200.0f、100.0f、0.0f);
gl.glEnd();
gl.glDisable(gl.gl\u纹理\u 2D);

在绑定任何纹理(或可能绑定其他纹理)之前,您正在调用
gl.glTexImage2D
,但此函数会更改当前绑定纹理对象的纹理图像。因此,在代码中,您应该在
gl.glBindTexture(gl.gl\u TEXTURE\u 2D,textures[0])
之后调用它


顺便说一句,我希望这段代码不是每一帧都调用(draw函数暗示了这一点),因为你不应该每一帧都创建一个新的纹理对象(先别说从HDD读取一个图像)(先别说你实际上没有删除它)。实际上,您应该在一些初始化代码中创建纹理对象,将图像放入其中并调整其参数,以便在绘图代码中只需调用
glBindTexture
(可能还有
glEnable(GL\u texture\u 2D)
或类似的东西)。

在绑定任何纹理之前调用
GL.glTexImage2D
(或者绑定了其他纹理),但此函数会更改当前绑定纹理对象的纹理图像。因此,在代码中,您应该在
gl.glBindTexture(gl.gl\u texture\u 2D,textures[0])之后调用它。


顺便说一句,我希望这段代码不是每帧调用一次(draw函数暗示了这一点),因为你不应该在每一帧创建一个新的纹理对象(撇开从HDD读取图像不谈)(撇开你实际上没有删除它)。实际上,您应该在一些初始化代码中创建纹理对象,将图像放入其中并调整其参数,以便在绘图代码中只需调用
glBindTexture
(以及
glEnable(GL\u texture\u 2D)
或类似的东西).

欢迎来到StackOverflow,我希望您阅读。欢迎来到StackOverflow,我希望您阅读。