当前位置: 首页 > 知识库问答 >
问题:

OpenGL-在1D纹理中提供一组值

汝弘深
2023-03-14

我想在1D纹理中提供一组值。请考虑以下简单示例:

gl.glBindTexture(GL4.GL_TEXTURE_1D, myTextureHandle);
FloatBuffer values = Buffers.newDirectFloatBuffer(N);

for (int x = 0; x < N; ++x)
    values.put(x);

values.rewind();
gl.glTexImage1D(GL4.GL_TEXTURE_1D, 0, GL4.GL_R32F, N, 0, GL4.GL_RED, GL4.GL_FLOAT, values);

在这里,N是我要在纹理中存储的值的数量。但是,在我的片段着色器中调用texture Size(myTexture,0)会产生1(无论我设置了什么N)。那么,这里出了什么问题?

编辑:上面的代码在初始化时执行。我的渲染循环看起来像

gl.glClear(GL4.GL_COLOR_BIT |GL4.GL_DEPTH_BUFFER_BIT);
gl.glUseProgram(myProgram);
gl.glActiveTexture(MY_TEXTURE_INDEX);
gl.glBindTexture(GL4.GL_TEXTURE_1D, myTextureHandle);
gl.glUniform1i(uMyTexture, MY_TEXTURE_INDEX);
gl.glDrawArrays(GL4.GL_POINTS, 0, 1);

我的顶点着色器由一个不起任何作用的-函数组成。我正在使用几何体着色器创建一个全屏四边形。像素着色器代码如下所示

uniform sampler1D myTexture;
out vec4 color;

void main()
{
    if (textureSize(myTexture, 0) == 1)
    {
        color = vec4(1, 0, 0, 1);
        return;
    }
    color = vec4(1, 1, 0, 1);
}

结果是一个红色的窗口。

共有1个答案

包建义
2023-03-14

确保你的纹理完整。由于GL_纹理\u最小\u过滤器默认为GL_最近的\u MIPMAP\u线性,因此您必须提供全套MIPMAP。

或者将GL\u纹理\u最小\u过滤器设置为GL\u最近的/GL\u线性

您还需要将GL_TEXTURE0 MY_TEXTURE_INDEX(而不仅仅是MY_TEXTURE_INDEX)传递到glActiveTexture()

gl.glActiveTexture( GL_TEXTURE0 + MY_TEXTURE_INDEX );
...
gl.glUniform1i( uMyTexture, MY_TEXTURE_INDEX );
 类似资料:
  • 在我的程序中,我使用了2种纹理:t0和t1。t1是附加的,仅在某些情况下需要: 绘图着色器: 它的工作原理很好:第二个纹理在需要时首先重叠。假设使用glBindTexture(..,0)返回零纹理(0,0,0,0),但在将NVidia驱动程序更新到314.07后,我的代码会出现黑屏,比如glBindTexture(..,0)返回(0,0,0,1)纹理。 我做了一些测试:使用着色器 我在旧驱动程序(

  • 我使用OpenGL 3.2来渲染阴影贴图。为此,我构造了一个渲染深度纹理的帧缓冲区。 要将纹理附加到帧缓冲区,我使用: 这很有效。渲染灯光视图后,我的GLSL着色器可以对深度纹理进行采样,以解决灯光的可见性问题。 我现在试图解决的问题是有更多的阴影贴图,比如说50个。在我的主要渲染过程中,我不想从50个不同的纹理中采样。我可以使用图集,但我想知道:我可以将所有这些阴影贴图作为2D纹理数组的切片传递

  • 我有一个用于OpenGL中模型渲染的纹理数组。此数组包含漫反射和镜面纹理。由于某些网格没有镜面纹理,因此我在每次渲染后简单地将NULL纹理绑定到我的镜面采样器,并且只有当网格具有镜面纹理时,我才绑定一个。但是,我仍然在没有镜面纹理的网格上看到镜面纹理。 这是我的渲染代码 材质索引保存数组中纹理的索引,如果网格没有镜面纹理 索引为-1 纹理单元0用于漫反射 纹理单元2用于镜面

  • 所以最近我开始阅读OpenGL维基文章。这就是我在这里描述OpenGL纹理的方式。不过,有几点尚不清楚。 以下陈述是真的、假的还是视情况而定? 将两个纹理绑定到同一个纹理单元是不可能的。 将两个采样器绑定到同一个纹理单元是不可能的。 将一个纹理绑定到两个不同的纹理单元是不可能的。 将一个采样器绑定到两个不同的纹理单元是不可能的。 应用程序有责任明确将什么采样器类型传递给什么统一变量。 着色器程序有

  • “我在我的申请中发现了一个奇怪的行为,希望你能解释给我听。”。你看,我有两个3D纹理,它们被发送到片段着色器,渲染得非常好。但有一个问题,当我创建另一个纹理(它是1D纹理)时,一个黑屏正在被渲染,而不是正确的前一个结果。 关于这个1D纹理,我甚至没有将其发送到片段着色器。当我调用glTexImage1D(…)时,黑屏就出现了。我评论这句话,它就消失了!!这两种纹理被渲染。 我觉得纹理单位肯定有问题

  • 在andrid上的opengl es中,当我将两个纹理相邻放置时,会有一个轻微的接缝,可以看到它们后面绘制的对象。基本上看起来是一个小差距。我把范围缩小到了地图上 glTexParameteri(GL_纹理_2D、GL_纹理_最小过滤器、GL_线性_MIPMAP_线性);glTexParameteri(GL_纹理_2D、GL_纹理_MAG_过滤器、GL_线性); 如果我将它们都设置为距接缝最近的G