- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试弄清楚如何使用 GLSL 4.10 版进行纹理映射。我是 GLSL 的新手,很高兴今天使用着色器基于 sin(time) 进行颜色渐变的三角形渲染。现在我对使用具有单一纹理的着色器很感兴趣。
很多教程甚至 Stack Overflow 答案都建议使用 gl_MultiTexCoord0。然而,自 GLSL 1.30 以来,这已被弃用,最新版本现在是 4.20。我的显卡不支持 4.20,这就是我尝试使用 4.10 的原因。
我知道我正在适本地生成和绑定(bind)我的纹理,并且我有正确的顶点坐标和纹理坐标,因为当我使用固定功能管道时我的高度图呈现完美,并且它用颜色而不是纹理渲染得很好。
这是我的 GLSL 着色器和一些 C++ 绘制代码:
---heightmap.vert (GLSL)---
in vec3 position;
in vec2 texcoord;
out vec2 p_texcoord;
uniform mat4 projection;
uniform mat4 modelview;
void main(void)
{
gl_Position = projection * modelview * vec4(position, 1.0);
p_texcoord = texcoord;
}
---heightmap.frag (GLSL)---
in vec2 p_texcoord;
out vec4 color;
uniform sampler2D texture;
void main(void)
{
color = texture2D(texture, p_texcoord);
}
---Heightmap::Draw() (C++)---
// Bind Shader
// Bind VBO + IBO
// Enable Vertex and Texcoord client state
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureId);
// glVertexPointer(...)
// glTexCoordPointer(...)
glUniform4fv(projLoc, projection);
glUniform4fv(modelviewLoc, modelview);
glUniform1i(textureId, 0);
// glDrawElements(...)
// glDisable/unbind everything
我还怀疑我是否必须将纹理坐标作为变量传递给片段着色器,因为我没有在顶点着色器中触及它。另外,我不知道如何从中获取内插的纹理坐标。看起来它只会得到 0.f 或 1.f,而不是插值坐标。我对着色器的了解还不够,无法理解它是如何工作的。如果有人能启发我,我会很高兴!
编辑 1:
@Bahbar:很抱歉,打错了。我在一台机器上输入代码,同时从另一台机器上读取代码。就像我说的,这一切都适用于固定功能管道。尽管 glEnableClientState 和 gl[Vertex|TexCoord]Pointer 已被弃用,但它们仍应与着色器一起使用,不是吗? glVertexPointer 而不是 glVertexAttribPointer 使用颜色而不是纹理。另外,我正在使用 glBindAttribLocation(位置为 0,纹理坐标为 1)。
我仍在使用 glVertexPointer 的原因是我试图一次取消弃用一件事。
最佳答案
glBindTexture
将纹理对象作为第二个参数。
// Enable Vertex and Texcoord client state
我假设您指的是通用顶点属性?您的 position
和 texcoord
属性设置在哪里?为此,您需要调用 glEnableVertexAttrib 和 glVertexAttribPointer 而不是 glEnableClientState 和 glVertex/TexCoordPointer(所有这些都已弃用,与 gl_MultiTexCoord 在 glsl 中的使用方式相同)。
当然,要找出属性的绑定(bind)位置,您需要调用 glGetAttribLocation 来找出 GL 选择放置属性的位置,或者使用 glBindAttribLocation 自行定义它(在链接程序之前)。
编辑以添加,在您添加之后:
好吧,0 可能最终会从 glVertexPointer 中提取数据(出于您不应依赖的原因。attrib 0 是特殊的,大多数 IHV 使其像 Vertex 一样工作),但 1 很可能不会从 glTexCoord 中提取数据。
理论上,通用属性(比如你的 texcoord,它从 glVertexAttribPointer(1,XXX) 获取数据,这里的 1 是你选择的位置)和内置属性(比如 gl_MultiTexCoord[0 ] 从 glTexCoordPointer 获取数据)。
现在,众所周知,nvidia 不遵循规范,并且确实对属性进行了别名(据我所知,这来自 Cg 模型),甚至会说要为 glTexCoord 使用特定的属性位置( Cg spec 建议它为 TexCoord0 使用位置 8 - 位置 1 是属性混合权重 - 请参阅表 39,p242),但实际上你应该咬紧牙关并将你的 TexCoordPointer 切换为 VertexAttribPointer 调用。
关于c++ - GLSL 4.10 纹理贴图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8317242/
我试图理解这两个概念。我正在阅读的手册对它们非常简短,像多 channel 算法这样的东西对我来说是新的。我想要一些示例(不是代码),说明我需要在哪里使用不变变量或精确变量,只是为了获得一个大致的想法
您好,我正在尝试获得一个快速的圆角矩形 glsl 着色器,但我只设法使用此函数( https://github.com/marklundin/glsl-sdf-primitives/blob/mast
这可能是一个简单的问题。作为 GLSL 的新手,我宁愿在这里问。 现在,在顶点着色器中,我可以通过以下方式获取世界坐标系中的位置: gl_Position = ftransform();
我想知道是否有人拥有完整、有效且高效的代码来在 glsl 中进行双三次纹理过滤。有这个: http://www.codeproject.com/Articles/236394/Bi-Cubic-and
真的有两个问题... GLSL ES 2 是完全独立的语言,还是 GLSL 的特殊版本? 在“标准库”函数、语法和功能方面,它们之间有什么区别? 我正在为一个针对 Windows、Mac 和 iPad
从GLSL文档(https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/length.xhtml)中,长度函数“计算 vector 的长度”
我想在 GLSL 着色器中实现颜色矩阵滤镜,但找不到与此相关的任何文档。我是着色器世界的新手(我自己从未编写过代码)所以如果我的解释/词汇没有意义,请原谅我。 到目前为止我可以收集到的信息: 一个颜色
我刚刚开始使用 openframeworks 中的着色器,并且正在尝试编写一个片段着色器,它根据片段的观看角度来更改片段的颜色。例如,给定一个矩形,如果从正面看(相机与法线平行)它会是红色,但如果从侧
似乎某些在 case 中具有输出的函数可能使用 if 语句作为底层实现,从而导致分支。我不认为它,但我想知道。 对于 sign(x),如果数字是正数、负数或零,则分别重新运行 1、-1 和 0。 那么
如何在 glsl 中执行位操作? 使用常规 C 风格的按位运算符 | , & , ^ , 或 !不起作用。 最佳答案 它们是在 GLSL 1.30 (OGL 3.0) 中引入的。 根据您想要做什么,您
最近我一直在玩 webGl,我偶然发现了一个很酷的小演示 here (来源 here )我想稍微改变一下以获得一些很酷的结果。 我对改变地形的生成方式很感兴趣。而不是分层 10 个 Octave
这是每个设备的事情吗?还是基于浏览器?抱歉问了这样一个基本问题,但我似乎找不到直接的答案。 最佳答案 它基于 OpenGL ES 2.0,并根据 the spec , 它必须支持 GLSL ES 版本
你如何在 GLSL 着色器中通过引用传递? 最佳答案 您可以将属性标记为 inout在函数签名中,这将使属性有效地“通过引用传递” 例如, void doSomething( vec3 trans,
我有一个浮点 RGBA 缓冲区,我想将其作为统一 Texel 缓冲区传递到我的计算着色器(用于只读访问,没有采样)。谁能告诉我如何在 GLSL 中执行此操作? 我能找到的所有示例似乎都在跳过该主题,或
我有一些参数从 CPU 传递到 GPU,这些参数对于所有片段都是恒定的,但在每一帧上都会发生变化(我使用的是 GLSL ES 1.1)。对于这些值,我应该使用制服还是属性?属性可能因顶点而异,所以我的
我已经看到这个伪随机数生成器在着色器中使用,引用here and there around the web : float rand(vec2 co){ return fract(sin(dot(
我尝试在结构内初始化数组,如下所示: struct myStruct { vec3 data[20] = vec3[20] (vec3(1, 1, 1), vec3( 1, -1, 1), v
我尝试在结构内初始化数组,如下所示: struct myStruct { vec3 data[20] = vec3[20] (vec3(1, 1, 1), vec3( 1, -1, 1), v
在 GLSL 着色器中,出于各种原因,我经常需要几个函数来修改单个值(例如,片段着色器使用四个函数来应用照明、纹理、镜面反射和雾化)。我可以想到至少三种方法来传递这些值进行修改: 使用 inout每个
我在 SL 引用中搜索了“copy”,但找不到任何相关内容。 如果我有: float a[3] = float[3] (1.0,2.0,3.0); float b[3] = a; 是 b现在指向 a
我是一名优秀的程序员,十分优秀!