opengl - 在 OpenGL 的片段着色器中获取原始纹理颜色

标签 opengl colors shader textures lwjgl

所以,我需要制作一个着色器来用给定的颜色替换纹理中的灰色。如果我将颜色设置为给定的特定颜色,则片段着色器可以正常工作,例如

gl_FragColor = vec4(1, 1, 0, 1);

但是,当我尝试检索纹理的原始颜色时出现错误。由于某种原因,它总是返回黑色。
uniform sampler2D texture; //texture to change

void main() {
  vec2 coords = gl_TexCoord[0].xy;
  vec3 normalColor = texture2D(texture, coords).rgb; //original color

  gl_FragColor = vec4(normalColor.r, normalColor.g, normalColor.b, 1);
}

理论上,它应该什么都不做——纹理应该保持不变。但它变得完全黑色。我认为问题在于我不确定如何将纹理作为参数传递(到统一变量)。我目前正在使用 ID(整数),但它似乎总是返回黑色。所以我基本上不知道如何设置统一纹理的值(或以任何其他方式获取它,而不使用参数)。代码(在Java中):
program.setUniform("texture", t.getTextureID());

我正在使用来自 here 的 Program 类,还有 SlickUtils Texture 类,但我认为这无关紧要。

最佳答案

program.setUniform("texture", t.getTextureID());
                              ^^^^^^^^^^^^^^^^

不不不。

纹理对象 ID 永远不会统一。

传入要从中采样的纹理单元的索引。

因此,如果您想从 n 中取样第一个纹理单元 ( GL_TEXTURE0 + n ) 传入 n :
program.setUniform("texture", 0);
                              ^ or whatever texture unit you've bound `t` to

关于opengl - 在 OpenGL 的片段着色器中获取原始纹理颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17068263/

相关文章:

c++ - 如何在 C++ 中使用 XCode 4.2 设置 OpenGL 项目?

获得最佳文本颜色的算法

colors - 如何根据背景颜色决定字体颜色为白色或黑色?

javascript - Highcharts - 负值列 - 列颜色

c++ - 白屏(OpenGL)

opengl - 数百万个原语的哪种鼠标采摘策略?

opengl - 将 OpenGL 纹理转换为 OpenCV Mat

android - 有没有办法在顶点着色器的一个点的位置用 fragment 着色器绘制一个圆?

c++ - 使用 pow() 时的 GLSL 问题

c++ - 关于TTF和OpenGL的查询