关于VTF(顶点纹理提取)

时间:2014-03-22 15:54:14

标签: opengl glsl vertex-shader terrain

我正在研究剪贴画算法,我想通过VTF获得提升。 但是在使用顶点纹理时我遇到了问题。我不知道出了什么问题。 相关代码是这样的:

int width=127;

float *data=new float[width*width];
for(int i=0;i<width*width;i++)
data[i]=float(rand()%100)/100.0;
glGenTextures(1, &vertexTexture);   
//glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, vertexTexture);

//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_NEAREST);
glTexImage2D(
        GL_TEXTURE_2D, 0, GL_LUMINANCE_FLOAT32_ATI, 
        width, width, 0, GL_LUMINANCE, GL_FLOAT, data);

顶点着色器中的GLSL代码如下所示:

#version 410
uniform mat4    mvpMatrix;
uniform sampler2D vertexTexture;
in vec2 vVertex;

void main(void) 
{ 
    vec2 vTexCoords=vVertex/127.0; 
    float height = texture2DLod(vertexTexture, vTexCoords,0.0).x*100.0;
    // I also tried texture2D(vertexTexture, vTexCoords) 
    // and texture(vertexTexture, vTexCoords),but they don't work.
    vec4 position=vec4(vVertex.x,height,vVertex.y,1.0);
    gl_Position = mvpMatrix * position;
}

我在数组数据中存储了一些随机浮点数,然后用纹理存储它们,并且当顶点着色器显示时,我想通过VTF得到y坐标的一些值。但结果是高度总是为0.I认为一定是错的。我不知道出了什么问题以及如何以正确的方式做到这一点。

1 个答案:

答案 0 :(得分:1)

它现在已经解决了。答案是here。谢谢大家!

尝试在glTexImage2D()之后将纹理的缩小过滤器设置为GL_NEAREST或GL_LINEAR:

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);

OpenGL的默认设置是使用mipmap,你没有发送任何使纹理不完整的内容,并且会禁用该纹理图像单元。

然后你可以在着色器中使用纹理(vertexTexture,vTexCoords),而不是使用显式LOD访问的已弃用的texture2DLOD()版本。