顶点纹理拾取技术

来源:互联网 发布:手机淘宝怎么弄专营店 编辑:程序博客网 时间:2024/05/22 05:17

第一次看到这个技术是在论文《一种基于GPU的瓦片块四叉树地形绘制算法》(作者 王冬等)。这个应该不是新技术了,自己尝试用了下,感觉还可以,分享之。

我做东西都与我专业有关,自己边学边做,没什么技术含量,主要是交流学习。


    学纹理时,我们知道采样器都是在片段着色器中使用,然而在顶点着色器中也可以实用的,用顶点纹理拾取技术,最好用 矩形纹理采样器,因为他的纹理坐标没有规范化,可以直接使用。

    第一步,就是自己做一个二维矩形纹理,数据源我用的是glm::vec3的一位数组用来存储坐标值,创建完成后,就设置过滤方式 用GL_NEAREST。

代码如下

glGenTextures(1, &textureID);glBindTexture(GL_TEXTURE_RECTANGLE, textureID);glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glActiveTexture(GL_TEXTURE0);glBindTexture(GL_TEXTURE_RECTANGLE, textureID);glPixelStorei(GL_UNPACK_ALIGNMENT, 1);glTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_RGB32F, CHUNKSIZE, CHUNKSIZE, 0, GL_RGB, GL_FLOAT, (GLvoid*)chunkVertex);
chunkVertex就是上面所说的我定义的glm::vec3的一维数组。


其实不仅坐标可以,法向量也可以用这个传的。

顶点着色器代码

layout(location = 0) in vec2 position;layout(location = 1) in vec3 normal;...uniform sampler2DRect getHeight;.
.
.void main(){vec3 coods = texture(getHeight,position.xy).rgb;//顶点坐标


0 0