问题标签 [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.
opengl - 如何在 GLSL 中将定向光转换为相机空间
我有以下用于照明的 GLSL 代码:
光矢量在世界空间中指定。我使用gluLookAt
. 由于 OpenGL 假设光矢量在相机空间中,所以光会随着相机移动,而不是保持在固定的方向。
我尝试在调用之前和之后激活着色器并设置光矢量gluLookAt
,但我得到了相同的效果。我究竟需要做什么才能正确转换光矢量?
python - 使用 pygtkglext 的着色器
有人知道如何让 glsl 着色器在 gtk-opengl 窗口中工作吗?使用 glut all glCreateProgram
etc. 函数可以工作,但是当我尝试将相同的 gl 代码放入 pygtkglext 窗口时,它抱怨 NullReference:
那么我from OpenGL.GL.ARB.shader_objects import *
,但结果是相似的:
任何想法都会有用。
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();
修复了上述错误。
opengl - 无法链接已编译的着色器 (GLSL)
我有一个小类,允许我加载着色器并在我的程序中使用它们。我能够编译着色器,但是当需要链接它们时,他们就是不想这样做。使用 glGetProgramInfoLog 我得到以下错误日志。我不明白为什么它告诉我没有定义程序,因为编译工作正常......
下面的代码执行 GLSL 链接:
vertex_ 和 fragment_ 是顶点和片段着色器,program_ 是 ProgramObjectARB。
我想知道为了使这个运行我需要做哪些必要的修改。
顶点着色器:
片段着色器:
编辑 - 解决方案 我用来读取源文件的方法似乎不正确。着色器可以编译,但在链接时,它不能正常工作。现在我使用这种方法来读取我的文件并且链接是正确的:
java - 在 GLSL 中读取 32 位 RGBA 浮点值
我正在尝试将一些 32 位浮点数据发送到着色器,但结果不稳定。如果我用全白 (1,1,1,1) 进行测试,则这些值都为零。这是我创建纹理的代码:
并在 GLSL 中读取它:
如果我将纹理设置为随机值,则会出现一些东西,但这是不正确的。这是从 RGBA32F 纹理读取的正确方法还是我遗漏了什么?
optimization - GLSL 着色器生成法线
嗨,我正在编写 3D 建模应用程序,我想加快 OpenGL 中的渲染速度。目前我使用 glBegin/glEnd 这真的很慢而且不推荐使用。我需要绘制非常快速的平面阴影模型。我每帧都在 CPU 上生成法线。这是非常缓慢的。我尝试使用带有索引几何的 glDrawElements,但在法线生成中存在问题,因为法线是在顶点而不是三角形级别指定的。
另一个想法是在几何着色器中使用 GLSL 在 GPU 上生成法线。我为正常生成编写了这段代码:
当我将着色器集成到我的应用程序中时,速度并没有提高。这比以前更糟。我是 GLSL 和着色器的新手,所以我不知道我做错了什么。我在配备 Geforce 9400M 的 MacBook 上尝试了此代码。
更清楚地说,这是我要替换的代码:
如您所见,它的效率非常低,但是可以工作。triangles
是数组中的索引vertices
数组。
我尝试使用此代码进行绘图,但我不能只有一个索引数组而不是两个(一个用于顶点,第二个用于法线)。
现在,当某些顶点由不同的三角形共享时,如何指定指向法线的指针,因此它们的法线不同?
opengl - Cocoa 和 OpenGL,如何使用数组设置 GLSL 顶点属性?
我对 OpenGL 相当陌生,我似乎遇到了一些困难。我在 GLSL 中编写了一个简单的着色器,它应该通过给定的关节矩阵来转换顶点,从而实现简单的骨骼动画。每个顶点最多有两个骨骼影响(存储为 Vec2 的 x 和 y 分量)、与变换矩阵数组相关联的索引和相应权重,并在我的着色器中指定为“属性变量”,然后设置使用“glVertexAttribPointer”函数。
这就是问题出现的地方......我已经设法正确设置矩阵的“统一变量”数组,当我在着色器中检查这些值时,它们都被正确导入并且它们包含正确的数据。但是,当我尝试设置联合索引变量时,顶点乘以任意变换矩阵!他们跳到空间中看似随机的位置(每次都不同),我假设索引设置不正确,并且我的着色器正在将我的联合矩阵数组的末尾读取到以下内存中。我不完全确定为什么,因为在阅读了我能找到的关于该主题的所有信息后,我很惊讶在他们的示例中看到相同(如果不是非常相似)的代码,而且它似乎对他们有用。
我已经尝试解决这个问题很长一段时间了,它真的开始让我感到不安......我知道矩阵是正确的,当我手动将着色器中的索引值更改为任意整数时,它读取正确的矩阵值并按应有的方式工作,通过该矩阵转换所有顶点,但是当我尝试使用我编写的代码来设置属性变量时,它似乎不起作用。
我用来设置变量的代码如下...
我的顶点着色器看起来像这样......
这真的开始让我感到沮丧,任何和所有的帮助都将不胜感激,
——安德鲁·戈托
c++ - 为什么我不能在 Visual Studio 之外运行我的 OpenGL 程序?
我有一个使用 GLSL 的 OpenGL 程序,我可以使用 Visual Studio (2008) 中的播放按钮运行得很好——无论是在标准发布配置还是调试配置中。
但是,当我尝试从资源管理器运行可执行文件时,我得到的只是一个闪烁的 cmd 提示,其中没有任何文本来指示任何类型的加载失败。
我尝试将所需的 DLL 文件(glut32.dll、glew.dll 等)复制到可执行文件所在的文件夹中,但这并没有什么不同。我还尝试将 GLSL 文件复制到同一个文件夹,但这也无济于事。
我需要做什么才能使程序在没有 Visual Studio 的情况下运行?
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?
复制作品;
......但它很丑陋。
opengl - 创建阴影体积时如何在 GLSL 中转换背面顶点
我正在使用 OpenGL 编写游戏,并且正在尝试实现阴影体积。
我想通过顶点着色器在 GPU 上构建模型的阴影体积。为此,我用 VBO 表示模型,其中:
- 顶点是重复的,这样每个三角形都有自己独特的三个顶点
- 每个顶点都有其三角形的法线
- 由于我不打算进入的原因,我实际上是在做以上两点,所以我不太担心顶点重复
- 添加退化三角形以在每对“规则”三角形之间的边缘内形成四边形
使用这种模型格式,在顶点着色器中,我能够找到远离光线的三角形的一部分的顶点,并将它们移回以形成阴影体积。
我剩下要弄清楚的是我应该对背面顶点应用什么转换。
我能够检测到顶点何时背离光线,但我不确定应该对其应用什么变换。这是我的顶点着色器到目前为止的样子:
我尝试简单地设置gl_position
为ftransform() - (vec4(realLightDir, 1.0) * someConstant)
,但这会导致某种深度测试错误(当我用颜色渲染体积时,某些面似乎在其他人后面可见)并且someConstant
似乎并没有影响背面延伸的距离.
更新 - 1 月 22 日
只是想弄清楚我可能在什么空间。我必须说,跟踪我在什么空间是我的着色器头痛的最大根源。
渲染场景时,我首先使用gluLookAt
. 相机可能是固定的,也可能是移动的;没关系。然后我使用翻译功能glTranslated
来定位我的模型。
在程序中(即在 CPU 上),我表示世界空间中的光矢量(三个浮点数)。我在开发过程中发现,要在我的着色器的正确空间中获得这个光矢量,我必须在设置相机和定位模型之前将它乘以模型视图矩阵的倒数。所以,我的程序代码是这样的:
- 定位相机 (
gluLookAt
) - 取世界空间中的光向量,将其乘以当前模型视图矩阵的逆矩阵并将其传递给着色器
- 定位模型的转换
- 模型绘制
这会让事情变得更清楚吗?