我一直在尝试使用java和lwjgl在opengl中绘制320 x 240全屏分辨率图像。我将分辨率设置为640 x 480,并将像素的大小加倍以填充空间。经过大量的谷歌搜索后,我发现了一些关于使用glDrawPixels函数加速绘制到屏幕的信息。我想通过为屏幕上的所有像素分配随机颜色来测试它,但它不会填满屏幕。我将宽度分成4个部分,每个部分有80个像素,并将它们分为红色,绿色,蓝色和白色。我看到我正在交错颜色,但我无法弄清楚如何。
以下是输出图片:
这是我运行openGL代码的地方:
// init OpenGL
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glOrtho(0, 640, 0, 480, 1, -1);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
while (!Display.isCloseRequested()) {
pollInput();
// Clear the screen and depth buffer
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
randomizePixels();
GL11.glRasterPos2i(0, 0);
GL11.glDrawPixels(320, 240,GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE,buff);
GL11.glPixelZoom(2, 2);
Display.update();
}
Display.destroy();
}
这是我创建像素颜色数据的地方:
public void randomizePixels(){
for(int y = 0; y < 240; y++){
for(int x = 0; x < 320; x+=4){
/*
pixels[x * 320 + y] = (byte)(-128 + ran.nextInt(256));
pixels[x * 320 + y + 1] = (byte)(-128 + ran.nextInt(256));
pixels[x * 320 + y + 2] = (byte)(-128 + ran.nextInt(256));
pixels[x * 320 + y + 3] = (byte)(-128 + ran.nextInt(256));
*/
if(x >= 0 && x < 80){
pixels[y * 240 + x] = (byte)128;
pixels[y * 240 + x + 1] = (byte)0;
pixels[y * 240 + x + 2] = (byte)0;
pixels[y * 240 + x + 3] = (byte)128;
}else if(x >= 80 && x < 160){
pixels[y * 240 + x] = (byte)0;
pixels[y * 240 + x + 1] = (byte)128;
pixels[y * 240 + x + 2] = (byte)0;
pixels[y * 240 + x + 3] = (byte)128;
}else if(x >= 160 && x < 240){
pixels[y * 240 + x] = (byte)0;
pixels[y * 240 + x + 1] = (byte)0;
pixels[y * 240 + x + 2] = (byte)128;
pixels[y * 240 + x + 3] = (byte)128;
}else if(x >= 240 && x < 320){
pixels[y * 240 + x] = (byte)128;
pixels[y * 240 + x + 1] = (byte)128;
pixels[y * 240 + x + 2] = (byte)128;
pixels[y * 240 + x + 3] = (byte)128;
}
}
}
buff.put(pixels).flip();
}
如果你能弄清楚为什么我不能让像素排列到x和y坐标,我希望他们去那里会很棒。我已经读过glDrawPixels可能不是向屏幕绘制像素的最佳或最快的方法,但我想了解为什么在我必须转向其他方法之前我遇到了这个特殊问题。
答案 0 :(得分:4)
只需将图像(未缩放)加载到纹理中并绘制纹理四边形。
请勿使用glDrawPixels
。此函数在大多数驱动程序中从未正确优化,并且自OpenGL-2以来已被弃用,并且已从OpenGL-3核心及以后删除。
答案 1 :(得分:2)
我在randomizePixels()
中发现了2个问题。
像素缓冲区的总大小为 320x240x4字节,因为像素类型为GL_RGBA。因此,使用下标运算符[]索引每个像素,它将是;
for(int y = 0; y < 240; y++)
{
for(int x = 0; x < 320; x++)
{
pixels[y * 320 * 4 + x * 4 + 0] = ... // R
pixels[y * 320 * 4 + x * 4 + 1] = ... // G
pixels[y * 320 * 4 + x * 4 + 2] = ... // B
pixels[y * 320 * 4 + x * 4 + 3] = ... // A
}
}
8位颜色的最大强度 255 ,例如,不透明的红色像素将是(255,0,0,255)。
答案 2 :(得分:0)
你对纹理的操作。在正交上做得更好。它会产生良好的效果