在没有着色器的情况下在OpenGL中进行GPU缩放着色

时间:2014-05-27 09:48:05

标签: c++ opengl texture-mapping

我正在编写一个程序来绘制实时噪声数据流的分布。情节看起来像

enter image description here

场景被点亮3个灯 - 2个漫反射和1个环境光 - 以便在对数据应用滤波后显示建模

enter image description here

目前垂直缩放和顶点颜色分配是在我使用以下代码将顶点发送到GPU之前通过我的代码完成的:

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(c_vertex), &(vertex_store[0][0].x));
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(3, GL_FLOAT, sizeof(c_vertex),&(vertex_store[0][0].r));
glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, sizeof(c_vertex),&(vertex_store[0][0].nx));
glDrawElements(GL_TRIANGLES, (max_bins-1)*(max_bins-1)*2*3, GL_UNSIGNED_INT, vertex_order);

使用较旧的功能是为了让我可以让固定的管道进行照明计算而不用我写一个着色器[我没有做过用3个光源进行照明所需的深度]

为了加快处理速度,我想将未缩放的数据发送到GPU并应用X和Z比例为1的矩阵和适当值的Y比例,以使峰值在y轴上达到+1。在此之后,我想让GPU根据查询表中的后缩放Y值选择顶点的颜色,我认为这是一个纹理贴图。

现在我知道如果我编写自己的着色器,我可以做最后一段 - 但是必须编写我想避免做的照明代码。无论如何使用上面绘图代码中的缓冲区吗?

1 个答案:

答案 0 :(得分:0)

  

在   然后,我想让GPU选择顶点的颜色   取决于它从查询表中缩放Y值的后期   假设是纹理贴图。

真的应该为此编写自己的着色器。为3个光源写一个着色器并不复杂,只需为一个光源写一个并围绕它进行循环。

但是,我认为您所要求的仍然可以通过固定功能管道完成。您可以使用1D纹理作为颜色,启用纹理和自动纹理坐标生成,后者通过glTexGen()系列函数。

在您的特定情况下,最佳appraoch似乎为GL_OBJECT_LINEAR设置s映射(第一个也是唯一一个纹理坐标,您需要1D纹理):

glEnable(GL_TEXTURE_GEN_S);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);

GL现在要做的是计算s作为输入顶点坐标(x,y,z,w)的函数,这样:

s=a*x + b*y + c*z + d*w

其中abcd只是您可以自由选择的一些系数。我假设您的原始顶点只需要通过缩放因子V沿y方向缩放,因此您可以将b=V和其他所有顶点设置为零:

GLfloat coeffs[4]={0.0f, V, 0.0f, 0.0f);
glTexGenfv(GL_S, GL_OBJECT_PLANE, coeffs);

然后,您只需启用纹理贴图并提供纹理即可获得所需的外观。