问题标签 [glsl]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
2193 浏览

java - 纹理没有出现在 GLSL 中的可能原因是什么?

我正在学习如何使用带有 GLSL 的纹理(在 LWJGL 中)来创建一个简单的片段着色器来模糊纹理。第一次尝试(出于测试目的)是一个非常简单的着色器,它只采用原始颜色值:

着色器编译得很好。编译后我链接并开始使用它,到目前为止一切正常并且没有报告错误。然后我尝试为纹理设置统一变量:

然后我只用正常的texcoords(两个维度上的0.0f-1.0f)绘制一个四边形,但纹理没有显示出来。纹理本身不是问题;我在没有片段着色器的情况下在第一个四边形旁边绘制了第二个四边形,它会按照您的预期显示。基本方法取自NeHe: GLSL - An IntroductionuniformTextureAddr不是-1,如果我使用更简单的着色器,它只会将每个像素变成红色,我会得到一个红色四边形。正如预期的那样。所以这个错误必须存在于整个 sampler2D 业务中。这也排除了一些琐碎的错误,例如四边形完全超出框架。

是的,在没有着色器的情况下绘制后,我再次用我的着色器调用 glUseProgramObject(programObj)。

顺便说一下,这是在带有 ATI Radeon Catalyst 10.6 驱动程序和 LWJGL 2.4.2 版的 Windows XP SP3 上运行的。

更新:我认为程序本身可能有问题。当我向着色器添加另一个变量时:

并调用glGetUniformLocationARB(programObject, "secondTexture");它只返回-1,即使它应该在那里。日志信息仍然只说:

信息日志:片段着色器已成功编译以在硬件上运行。

更新 2:

实际纹理是从后台缓冲区复制的。在较小的视口中绘制一条简单的白线,然后复制到纹理中:

但就像我说的,我不认为纹理是真正的问题,因为它在没有我的自定义着色器的情况下在第二个四边形上显示得很好。另外,不用担心绑定;这是程序中唯一的纹理,一开始只绑定一次。

这是我的绘图代码:

0 投票
5 回答
2931 浏览

opengl - 着色器语言之间是否存在重大差异?

我目前正在学习 GLSL。看起来,一旦您学习了一种着色器语言,学习其他一种语言似乎并不会太难。是否类似于学习 wxWidgets 之类的小部件工具集,然后切换到 Qt?一旦您了解了一个小部件工具集中发生了什么,另一个工具集会做类似的事情,因为它们最终在某个时候做几乎相同的事情?从一种着色器语言转换到另一种着色器语言的经历是什么?

0 投票
1 回答
1808 浏览

python - 如何在 OpenGL 的 GLSL 中重复 3x9 纹理?

我有一个 3x9 重复部分的纹理。我不想存储纹理的镶嵌 1920x1080 图像,我宁愿在代码中生成它,以便它可以在其他分辨率下正确应用。关于如何做到这一点的任何想法?原始纹理在这里:http: //img684.imageshack.us/img684/6282/matte1.png

我知道纹理不是 2 的幂,所以我必须在着色器中进行重复,我这样做:

这就是我绘制四边形的方式:

任何想法将不胜感激。

谢谢!

0 投票
1 回答
25208 浏览

iphone - 将变量传递给 OpenGL GLSL 着色器

我正在编写一个 iPhone 应用程序,它使用 GLSL 着色器对纹理执行转换,但我遇到的一点困难是将变量传递给我的 GLSL 着色器。

我已经读到可以让着色器读取 OpenGL 状态的一部分(我只需要对该变量的只读访问权限),但我不确定这种交换将如何发生。

简而言之,我试图获取在片段着色器之外创建的浮点值,以便片段着色器可以访问(无论它是传入还是从着色器内部读取)。

感谢您提供的任何帮助/指示,非常感谢!

0 投票
2 回答
6014 浏览

iphone - PowerVR SGX535 着色器性能 (OpenGL ES 2.0)

我目前正在为 iPad 游戏开发几个着色器,似乎 Apple 的 GLSL 编译器没有进行任何优化(或很少)。我可以在着色器中移动一条线并将我的 FPS 从 30 降低到 24,但我真的不知道为什么会发生这种情况。

是否有人对以下内容有任何参考:

  • 从 GLSL 指令生成哪些 PowerVR 指令?
  • PowerVR 指令的时序是什么?
  • PowerVR535 中有哪些类型的并行处理单元,如何利用它们?

谢谢,特里斯坦

0 投票
1 回答
7815 浏览

c++ - GLSL 中的 KD-Tree

在试图弄清楚如何在 OpenGL/GLSL 中实现 kd-tree 一天之后,我感到非常沮丧......

我在 GLSL 中这样声明我的 KD 节点:

SplitPoint 保存 kd-tree 分裂点,向量的第四个元素保存 splitDirection 在 3d 空间中形成一个平面。DataPtr 当前仅在树的叶子中保存随机值。

整个数组形成一个Ahnentafel List

在 C++ 中,结构如下所示:

我相信这是正确的,我将构建的树上传到缓冲区中。作为检查,我将缓冲区映射到主内存并检查值:

到目前为止看起来不错(它实际上表示体积在节点 0 的 y 方向上在 (0,256,0) 处拆分,-1 是没有数据的标志)。

现在对于树遍历,我尝试了这个:

此时屏幕上应该有一个随机颜色的图案。但在大多数情况下,什么都看不到。

我试图直接从节点获取值并获得正确的结果......所以我相信统一块数据的动态索引有问题。

我希望有人可以在这里帮助我......因为我的想法不多了:/

弗洛里安

0 投票
2 回答
2003 浏览

opengl - GLSL - 铸造问题和奇怪的错误

当我将浮点数转换为 int 时,我来这里是为了获得有关我的 GLSL 代码的奇怪行为的帮助,自从我启动 GLSL 以来,我从未见过这样的错误

实际上我正在尝试使用 GLSL 在 CPU 上实现网格蒙皮

我使用 ATI Radeon HD 4850 (Gainward),并在 Windows XP 上使用 OpenGL 2.1

所以在 CPU 端,我收集骨骼索引和权重,然后将它们扔到带有顶点属性的着色器中,然后我将骨骼矩阵与权重相乘,并使用结果来计算法线和 gl_Position

很平常,直到那里

当我必须从骨骼索引中检索骨骼时出现问题

我使用带有 4 根骨头的简单圆柱网格;我通过统一变量从 Cpu 发送骨骼,似乎问题不是来自这些骨骼矩阵,我在着色器中对它们进行了硬编码,并且错误仍然存​​在顺便说一下,当我与 Maya 渲染进行比较时,形状是正确的

此外,每个顶点的骨骼索引仍然相同:0、1、2、3;它们通过 VBO 以 GL_UNSIGNED_INT 类型发送;但在着色器中,uvec4 似乎不起作用(ivec4 也不行),所以我必须使用 float vec4 并使用 int()

所以这是我的顶点着色器代码:

当我查看 FPS 速率时会出现该错误;没有剥皮,我得到 2000 FPS

当我使用这条线时

mat += v_boneWeights0[i] * bones[i];,

我用一些人工制品得到了正确的形状,FPS 保持在 2000

但是当我使用这条线时

(与另一条线相似)形状很完美,但 FPS 下降到 1500 FPS...

我认为是线路本身减慢了循环速度;但是,如果我离开这条线并从正常和 gl_Position 计算中删除垫子,则 FPS 速率会上升到 2000

另一个奇怪的行为,如果我计算

就在循环之后,计算 Normal gl_Position 没有垫乘法

FPS率也上升到2000

就像只有当我结合时才会出现错误

我认为这是一个硬件错误,或者我做错了,我不知道但我确定问题与强制转换 int() 有关,顺便说一下,为什么 uvec4 和 ivec4 不起作用?

有人在 Nvidia 遇到过这种行为吗?我在 Google 上一无所获

我希望你能帮助我

谢谢 :)

0 投票
1 回答
736 浏览

opengl - GLSL着色器加载器问题

问题是我的 glsl 加载器不起作用,我看不出我做错了什么。

0 投票
4 回答
32912 浏览

glsl - GLSL中的printf?

在 C 中,我可以调试如下代码:

在 GLSL 中......无论如何我都可以在顶点或片段着色器中转储一个值吗?我不在乎它是否很慢;我只是想抛弃价值。理想情况下,我想要如下设置:

  • 正常状态 = 正常运行 GLSL 着色器
  • press key 'd' = 下一帧在ULTRA慢速模式下生成,其中 Vertex/Fragment 着色器中的“printfs”被执行并转储出去。

这可行吗?(我不关心性能;我只想为一帧执行此操作)。

谢谢!

0 投票
1 回答
868 浏览

iphone - 在 OpenGL ES 2 下的 GLSL 中,如何编写一个对先前输出进行操作的着色器

我需要一个以给定纹理开始的着色器,然后每一帧动画都对着色器的前一个输出加上其他输入进行操作。

如何组织帧缓冲区,以便每个帧都可以访问前一帧的输出,而不必从 CPU 来回移动缓冲区?