每个像素在OpenGL中绘制

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

我也对OpenGL感兴趣,但不太了解它。

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

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

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


您可以设置投影将顶点坐标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();

你真的不想这样做。

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

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

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

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

要做到这一点,您可以绘制单像素四边形(尽管必须小心处理它们并处理滤波以防止模糊),或者您可以获取纹理数据并在稍后进行处理。 两者都会令人难以置信的缓慢,但可以发挥作用。

处理纹理数据可能更简单,可能会稍微快一点。

链接地址: http://www.djcxy.com/p/45731.html

上一篇: per pixel drawing in OpenGL

下一篇: Converting pixels to dp