【问题标题】:Passing only 1 float in a sampler1D在 sampler1D 中仅传递 1 个浮点数
【发布时间】:2019-07-11 22:25:36
【问题描述】:

我有多个网格,我想在 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 是一个统一的 int,包含网格中的顶点数)

然后我用高度作为顶点的y值。

但是通过这样做,看起来我只能得到等于 0 的高度(无缘无故地以一个角度除外)。

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

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

【问题讨论】:

    标签: opengl glsl


    【解决方案1】:

    就像GL_TEXTURE_2DGL_TEXTURE_1D 使用归一化纹理坐标。由于您设置了GL_CLAMP_TO_EDGE,所有超出 [0, 1] 的值都将被限制在该区间内,因此您只能获得第一个和最后一个高度值。

    你要找的函数是texelFetch:

    vec4 tempo = texelFetch(heightData, index, 0);
    

    或者,您可以创建一个 UBO 并从其中的数组中读取数据。

    【讨论】:

    • 该死,我完全忘记了纹理坐标中的间隔!谢谢。就性能而言,使用 UBO 和采样器之间最好的是什么? (我正在学习openGL,我从未听说过UBO,我会读一点)
    • @GuillaumeMagniadas:我不了解性能,但据我了解,从基于 InstanceID/VertexID 的 UBO(或 SSBO?)读取顶点数据几乎就是 VAO 的底层内容.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 2012-07-15
    • 1970-01-01
    相关资源
    最近更新 更多