使用着色器使用OpenGL显示热图

时间:2014-09-27 15:10:02

标签: qt opengl glsl

我正在尝试使用着色器显示使用OpenGL的热图。

这是我的顶点着色器:

# version 130 
void main (void) 
{       
    vec4 vertex = gl_Vertex;
    gl_Position = gl_ModelViewProjectionMatrix * vertex; 
    gl_TexCoord[0] = gl_MultiTexCoord0; 
}

这是我的片段着色器:

# version 130 
uniform sampler2D heatmap;
uniform sampler1D colormap; 
void main (void) 
{   
    float temp = texture2D(heatmap, gl_TexCoord[1].st).r; // [0 - 50] degrees celcius
    float r = temp/50.0f;
    r = clamp(r, 0.0f, 1.0f); 
    gl_FragColor = texture1D(colormap, r);
}

这是我调用一次将纹理发送到GPU内存的代码:

glGenTextures(2, textures);
GLenum errc = glGetError();
if (errc != GL_NO_ERROR)
{
    const char* errmsg = (const char*)gluErrorString(errc);
    std::cerr << errmsg;
}

...

glEnable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_1D);
glBindTexture(GL_TEXTURE_2D, textures[0]); // makes the texture with id texture active

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, 100, 100, 0, GL_RED, GL_FLOAT, &data[0]);


glBindTexture(GL_TEXTURE_1D, textures[1]); // makes the texture with id texture active
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage1D(GL_TEXTURE_1D, 0, 3, 256, 0, GL_RGB, GL_FLOAT, &rgb[0]); 

这里的数据是一个100x100浮点数的std :: vector,而rgb是一个3x256浮点数的std :: vector。

这是我的绘图代码:

glBegin(GL_QUADS);                      // Draw A Quad
        glTexCoord2f(0.0, 1.0); 
        glVertex3f(0.0, 1.0, 0.0);
        glTexCoord2f(1.0, 1.0); 
        glVertex3f(1.0, 1.0, 0.0)
        glTexCoord2f(1.0, 0.0); 
        glVertex3f(1.0, 0.0, 0.0);
        glTexCoord2f(0.0, 0.0);
        glVertex3f(0.0, 0.0, 0.0);
glEnd();

我是否需要为每个顶点调用glTexCoord1f()?不使用这些值。

我特别使用Qt和QGLWidget。

我没有做任何事情。可能有什么问题?

一些观察: 如果改为设置gl_FragColor = texture2D(heatmap,gl_TexCoord [1] .st);在片段着色器中,我正确地看到了红色组件。

在上面的代码中glGenTextures失败了,但我仍然可以看到如上所述的红色组件。 如果我把这个调用移到glBindTexture之前就不会失败,但是后来我什么都没看到!?

0 个答案:

没有答案