在sampler1D中仅传递1个浮点

时间:2019-07-11 22:25:36

标签: opengl glsl

我想在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)。

纹理初始化时我可能做错了。

如果您有一个比通过纹理传递网格高度更好的主意,我会接受。

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并从其中的数组读取数据。