我想在glDrawElementsInstanced
中绘制多个网格,但是我希望所有顶点的高度都不同,因此,我尝试通过sampler1D传递高度。
这就是我创建纹理的方式:
glGenTextures(1, &meshHeightTexId_);
glBindTexture(GL_TEXTURE_1D, meshHeightTexId_);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
// meshHeight_.size() = meshNumber_*meshSize_
glTexImage1D(GL_TEXTURE_1D, 0, GL_RED, meshNumber_*meshSize_, 0, GL_RED, GL_FLOAT, meshHeight_.data());
glBindTexture(GL_TEXTURE_1D, 0);
(meshNumber_是网格数,meshSize_是包含顶点数,meshHeight_是包含所有高度数据的浮点向量)
我在抽奖之前打过电话:
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_1D, meshHeightTexId_);
在着色器中,我像这样收集值:
int index = gl_InstanceID * meshSize + gl_VertexID;
vec4 tempo = texture(heightData, index);
float height = tempo.r;
(heightData是我使用的sampler1D的名称,meshSize是一个统一的整数,其中包含网格中的顶点数)
然后我将高度用作顶点的y值。
但是这样做,看来我只能得到等于0的高度(无缘无故地成角度地画出1)。
纹理初始化时我可能做错了。
如果您有一个比通过纹理传递网格高度更好的主意,我会接受。
答案 0 :(得分:1)
就像include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<string> words;
for (string temp; cin >> temp;)
words.push_back(temp);
string disliked = "broccoli";
for (int i = 0; i < words.size(); ++i)
if (words[i] == disliked)
cout << "Bleep!" << '\n';
else
cout << words[i] << '\n';
}
一样,GL_TEXTURE_2D
也使用归一化纹理坐标。由于您设置了GL_TEXTURE_1D
,因此[0,1]以外的所有值都将被限制在该间隔内,因此您只会获得第一个和最后一个高度值。
您要查找的函数是GL_CLAMP_TO_EDGE
:
texelFetch
或者,您可以创建一个UBO并从其中的数组读取数据。