问题标签 [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 投票
5 回答
11412 浏览

opengl - 如何在 GLSL 中将定向光转换为相机空间

我有以下用于照明的 GLSL 代码:

光矢量在世界空间中指定。我使用gluLookAt. 由于 OpenGL 假设光矢量在相机空间中,所以光会随着相机移动,而不是保持在固定的方向。

我尝试在调用之前和之后激活着色器并设置光矢量gluLookAt,但我得到了相同的效果。我究竟需要做什么才能正确转换光矢量?

0 投票
2 回答
518 浏览

python - 使用 pygtkglext 的着色器

有人知道如何让 glsl 着色器在 gtk-opengl 窗口中工作吗?使用 glut all glCreateProgrametc. 函数可以工作,但是当我尝试将相同的 gl 代码放入 pygtkglext 窗口时,它抱怨 NullReference:

那么我from OpenGL.GL.ARB.shader_objects import *,但结果是相似的:

任何想法都会有用。

0 投票
4 回答
8280 浏览

windows - 编译和运行 GLSL 程序需要什么?

我正在尝试运行GLSL 示例,但我不能。

错误出现在glGetShaderiv(vShader, GL_COMPILE_STATUS, &status);程序退出的行中。vShader是文件vPhong.glsl

返回的错误是:

我已经“安装”并引用了 GLEW 和 Glut 及其 lib 文件。我已经glewInit完成了我的程序。

该程序能够找到 .glsl 文件。

奇怪的是我能够运行预编译的 GLSL-demo ,并且还可以在我的电脑上编译和运行该项目。非工作程序中的“初始化”与此相同。

我曾尝试将有缺陷的源代码复制到成功的项目中,以查看项目设置中是否存在导致错误的内容,但不幸的是,事实并非如此。所以错误似乎在 C++ 代码中,而不是项目中。


进步:

在我的 Windows 7 机器上,通过 Visual Studio 运行时出现“访问冲突”。如果我“单独”运行该程序,它就会停止工作。在 Windows XP 机器上,我遇到了一个未捕获的异常。

fopen编译程序时,我没有收到任何错误或警告(除了不安全的警告)。

Visual Studio 突出显示该行vShader = glCreateShader(GL_VERTEX_SHADER);作为错误的来源。

添加glewInit();修复了上述错误。

0 投票
3 回答
14962 浏览

opengl - 无法链接已编译的着色器 (GLSL)

我有一个小类,允许我加载着色器并在我的程序中使用它们。我能够编译着色器,但是当需要链接它们时,他们就是不想这样做。使用 glGetProgramInfoLog 我得到以下错误日志。我不明白为什么它告诉我没有定义程序,因为编译工作正常......

下面的代码执行 GLSL 链接:

vertex_ 和 fragment_ 是顶点和片段着色器,program_ 是 ProgramObjectARB。

我想知道为了使这个运行我需要做哪些必要的修改。

顶点着色器:

片段着色器:

编辑 - 解决方案 我用来读取源文件的方法似乎不正确。着色器可以编译,但在链接时,它不能正常工作。现在我使用这种方法来读取我的文件并且链接是正确的:

0 投票
1 回答
1405 浏览

java - 在 GLSL 中读取 32 位 RGBA 浮点值

我正在尝试将一些 32 位浮点数据发送到着色器,但结果不稳定。如果我用全白 (1,1,1,1) 进行测试,则这些值都为零。这是我创建纹理的代码:

并在 GLSL 中读取它:

如果我将纹理设置为随机值,则会出现一些东西,但这是不正确的。这是从 RGBA32F 纹理读取的正确方法还是我遗漏了什么?

0 投票
3 回答
6376 浏览

optimization - GLSL 着色器生成法线

嗨,我正在编写 3D 建模应用程序,我想加快 OpenGL 中的渲染速度。目前我使用 glBegin/glEnd 这真的很慢而且不推荐使用。我需要绘制非常快速的平面阴影模型。我每帧都在 CPU 上生成法线。这是非常缓慢的。我尝试使用带有索引几何的 glDrawElements,但在法线生成中存在问题,因为法线是在顶点而不是三角形级别指定的。
另一个想法是在几何着色器中使用 GLSL 在 GPU 上生成法线。我为正常生成编写了这段代码:

当我将着色器集成到我的应用程序中时,速度并没有提高。这比以前更糟。我是 GLSL 和着色器的新手,所以我不知道我做错了什么。我在配备 Geforce 9400M 的 MacBook 上尝试了此代码。

更清楚地说,这是我要替换的代码:

如您所见,它的效率非常低,但是可以工作。triangles是数组中的索引vertices数组。

我尝试使用此代码进行绘图,但我不能只有一个索引数组而不是两个(一个用于顶点,第二个用于法线)。

现在,当某些顶点由不同的三角形共享时,如何指定指向法线的指针,因此它们的法线不同?

0 投票
1 回答
1719 浏览

opengl - Cocoa 和 OpenGL,如何使用数组设置 GLSL 顶点属性?

我对 OpenGL 相当陌生,我似乎遇到了一些困难。我在 GLSL 中编写了一个简单的着色器,它应该通过给定的关节矩阵来转换顶点,从而实现简单的骨骼动画。每个顶点最多有两个骨骼影响(存储为 Vec2 的 x 和 y 分量)、与变换矩阵数组相关联的索引和相应权重,并在我的着色器中指定为“属性变量”,然后设置使用“glVertexAttribPointer”函数。

这就是问题出现的地方......我已经设法正确设置矩阵的“统一变量”数组,当我在着色器中检查这些值时,它们都被正确导入并且它们包含正确的数据。但是,当我尝试设置联合索引变量时,顶点乘以任意变换矩阵!他们跳到空间中看似随机的位置(每次都不同),我假设索引设置不正确,并且我的着色器正在将我的联合矩阵数组的末尾读取到以下内存中。我不完全确定为什么,因为在阅读了我能找到的关于该主题的所有信息后,我很惊讶在他们的示例中看到相同(如果不是非常相似)的代码,而且它似乎对他们有用。

我已经尝试解决这个问题很长一段时间了,它真的开始让我感到不安......我知道矩阵是正确的,当我手动将着色器中的索引值更改为任意整数时,它读取正确的矩阵值并按应有的方式工作,通过该矩阵转换所有顶点,但是当我尝试使用我编写的代码来设置属性变量时,它似乎不起作用。

我用来设置变量的代码如下...

我的顶点着色器看起来像这样......

这真的开始让我感到沮丧,任何和所有的帮助都将不胜感激,

——安德鲁·戈托

0 投票
1 回答
718 浏览

c++ - 为什么我不能在 Visual Studio 之外运行我的 OpenGL 程序?

我有一个使用 GLSL 的 OpenGL 程序,我可以使用 Visual Studio (2008) 中的播放按钮运行得很好——无论是在标准发布配置还是调试配置中。

但是,当我尝试从资源管理器运行可执行文件时,我得到的只是一个闪烁的 cmd 提示,其中没有任何文本来指示任何类型的加载失败。

我尝试将所需的 DLL 文件(glut32.dll、glew.dll 等)复制到可执行文件所在的文件夹中,但这并没有什么不同。我还尝试将 GLSL 文件复制到同一个文件夹,但这也无济于事。

我需要做什么才能使程序在没有 Visual Studio 的情况下运行?

0 投票
1 回答
1477 浏览

graphics - 食人魔材料脚本;我如何给一个技术多个 lod_indexes?

我有一个定义 4 种渲染技术的Ogre材质脚本。1 个使用 GLSL 着色器,然后 3 个仅使用不同分辨率的纹理。
如果显卡支持它,我想无条件地使用 GLSL 着色器,否则其他 3 个纹理取决于相机距离。

目前我的剧本是;


额外的信息

食人魔手册说;

增加索引表示较低级别的详细信息

您可以(并且经常会)将不止一种技术分配给同一个 LOD 索引,这意味着 OGRE 将选择“在同一 LOD 索引中列出的技术中的最佳技术。

OGRE 确定哪个是“最好的”,首先列出哪个。

目前,在我使用的支持 GLSL 版本的机器上,脚本的行为如下;

  • Camera > 2000 : 着色器技术
  • Camera >1600 <= 2000 : Medium // 这里选择我的“纹理”技术而不是着色器
  • 相机 <= 1600 : 高 //

如果我将着色器技术中的 lod 顺序更改为

仅使用最新的 lod_index。


如果我将其更改为

它对我大喊

那么如何指定一种技术来拥有 3 个 lod_indexes?

复制作品;

......但它很丑陋。

0 投票
1 回答
1419 浏览

opengl - 创建阴影体积时如何在 GLSL 中转换背面顶点

我正在使用 OpenGL 编写游戏,并且正在尝试实现阴影体积。

我想通过顶点着色器在 GPU 上构建模型的阴影体积。为此,我用 VBO 表示模型,其中:

  • 顶点是重复的,这样每个三角形都有自己独特的三个顶点
  • 每个顶点都有其三角形的法线
    • 由于我不打算进入的原因,我实际上是在做以上两点,所以我不太担心顶点重复
  • 添加退化三角形以在每对“规则”三角形之间的边缘内形成四边形

使用这种模型格式,在顶点着色器中,我能够找到远离光线的三角形的一部分的顶点,并将它们移回以形成阴影体积。

我剩下要弄清楚的是我应该对背面顶点应用什么转换。

我能够检测到顶点何时背离光线,但我不确定应该对其应用什么变换。这是我的顶点着色器到目前为止的样子:

我尝试简单地设置gl_positionftransform() - (vec4(realLightDir, 1.0) * someConstant),但这会导致某种深度测试错误(当我用颜色渲染体积时,某些面似乎在其他人后面可见)并且someConstant似乎并没有影响背面延伸的距离.

更新 - 1 月 22 日

只是想弄清楚我可能在什么空间。我必须说,跟踪我在什么空间是我的着色器头痛的最大根源。

渲染场景时,我首先使用gluLookAt. 相机可能是固定的,也可能是移动的;没关系。然后我使用翻译功能glTranslated来定位我的模型。

在程序中(即在 CPU 上),我表示世界空间中的光矢量(三个浮点数)。我在开发过程中发现,要在我的着色器的正确空间中获得这个光矢量,我必须在设置相机和定位模型之前将它乘以模型视图矩阵的倒数。所以,我的程序代码是这样的:

  • 定位相机 ( gluLookAt)
  • 取世界空间中的光向量,将其乘以当前模型视图矩阵的逆矩阵并将其传递给着色器
  • 定位模型的转换
  • 模型绘制

这会让事情变得更清楚吗?