opengl java加载png纹理无法正常工作
我试图加载一个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
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,我希望您阅读。