OpenGL中的每像素绘图

时间:2011-10-22 17:27:33

标签: opengl 3d

我曾经用“每像素”绘画写小游戏, 我的意思是使用一些SetPixel(x,y,color)函数等。

我也对OpenGL感兴趣,但对此并不了解。

在OpenGL中进行每像素绘制是一种好的(快速)方法吗?

例如,使用纹理四边形作为精灵, 或整个应用程序背景屏幕,有可能 使用某种我自己的SetPixel例程设置不同的像素 我会写......或任何其他方式 - 但它应该是有效的 尽可能多的

(特别是我对OGL的基本基础1.0版本感兴趣)

2 个答案:

答案 0 :(得分:6)

您可以设置一个投影,将顶点坐标1:1映射到像素坐标:

glViewport(0, 0, window_width, window_height);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, window_width, 0, window_height, -1, 1);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

从此开始,顶点X,Y坐标以像素为单位,原点位于左下角。理论上,您可以将立即模式与GL_POINT原语一起使用。但批量处理是一个更好的主意。而不是单独发送每个点创建一个包含您想要绘制的所有点的数组:

struct Vertex
{
    GLfloat x,y,red,green,blue;
};

std::vector<Vertex> vertices;
/* fill the vertices vector */

这可以让OpenGL指向......

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);

/* Those next two calls don't copy the data, they set a pointer, so vertices must not be deallocated, as long OpenGL points to it! */
glVertexPointer(2, GL_FLOAT, sizeof(Vertex), &vertices[0].x);
glColorPointer(3, GL_FLOAT, sizeof(Vertex), &vertices[0].red);

...让它通过一次通话访问并绘制所有内容:

glDrawArrays(GL_POINTS, 0, vertices.size();

答案 1 :(得分:1)

你真的不想这样做。

  

在OpenGL中进行每像素绘制是一种好的(快速)方法吗?

没有好的或快速的方法来做到这一点。由于速度,它非常气馁。

正确的方法,虽然在OGL 1中不容易(或在某些情况下可能),但是使用像素着色器或混合模式。这是唯一正确的方法,其他任何东西都是整个系统的黑客攻击。

根据数据需求的修改方式,顶点颜色和混合模式可能能够解决某些用途。它不会单独为每个像素着色,但您可以更快地修改纹理。

要做到这一点,你可以绘制单像素四边形(尽管必须小心偏移它们并处理过滤以防止模糊)或者你可以获得纹理数据并在以后操作它。两者都将令人难以置信地缓慢,但可能会起作用。

使用纹理数据可能更简单,可能会稍快一些。