我正在研究剪贴画算法,我想通过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认为一定是错的。我不知道出了什么问题以及如何以正确的方式做到这一点。
答案 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()版本。