问题标签 [shader]

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 投票
1 回答
28928 浏览

shader - 使用像素着色器效果帮助亮度和对比度

什么是应用亮度和对比度的简单像素着色器脚本效果?

我找到了这个,但它似乎不正确:

谢谢!

0 投票
4 回答
1758 浏览

opengl - 为什么我不知道 GLSL 中 OpenGL 灯的状态?

有没有办法找出是否在 GLSL 中启用了不涉及传递属性或创建大量不同着色器的灯光?

使用 NVidia 的 C for Graphics (Cg) 怎么样?我可以用 Cg 做吗?

我现在确信你做不到。但现在我问:为什么不呢?

0 投票
1 回答
402 浏览

preprocessor - 我可以看到着色器预处理器的输出吗?

我正在使用#defines,我根据程序状态将运行时传递给我的着色器源,以优化我的巨大着色器以降低复杂性。我想将优化的着色器写入文件,这样下次我运行程序时,我不必再次传递#defines,但我可以在程序启动期间直接编译优化的着色器,因为现在我知道什么样的着色器了按程序需要。

有没有办法从着色器预处理器中获取结果?我当然可以将#define 值存储到一个文件中,并基于该文件在程序启动期间编译着色器,但这不会那么优雅。

0 投票
2 回答
5381 浏览

opengl - 带有 Dev-C++ 和 SDL 的 OpenGL v2.0 着色器?

我正要在 Windows 下用 Dev-C++ 重建我的库;但是,不支持我在此期间添加的着色器功能,编译器找不到相关函数(::glCreateShader()、::glCreateProgram() 等)

在互联网和 Dev-C++ 文件夹中挖掘,我发现 OpenGL 实现(gl.h)只有 v1.1。我找到了从SGI下载最新标头的建议。我找到了 gl3.h,但是,经过仔细审查后,我意识到 gl.h 无论如何都不包含在我的项目中,我应该查看 SDL/SDL_opengl.h。

编辑: SDL_opengl.h确实包含 gl.h声明了相关函数的原型。所以问题是,为什么我给出的是编译时错误而不是链接器错误?

(我的库只链接到 mingw32、libOpenGL32、libSDL、libSDL_Image 和 libSDL_Mixer,就像在 OSX 下(当然,mingw32 除外)我没有任何问题。)

如何在 Dev-C++ 和 SDL 中使用 OpenGL v2.0 着色器?

0 投票
3 回答
3656 浏览

c++ - DirectX 后处理着色器

我有一个简单的应用程序,我需要让用户在其中选择一个着色器(.fx HLSL 或程序集文件,可能有多个通道,但只有像素着色器)并预览它。

应用程序运行,着色器列表出现,一个按钮启动“预览窗口”。从这个预览窗口(其中有一个 DirectX 视口)中,用户选择一个图像,着色器在该图像上运行并显示。只有一帧需要渲染(不是实时的)。

我设置了一个顶点/像素着色器组合,它采用四边形并将其渲染到屏幕上,并使用所选图像进行纹理化。这完美地工作。然后我需要在第一个效果的输出上运行另一个效果,纯像素着色器,并将最终图像(后处理)显示到屏幕上。这根本行不通。

在过去的几天里,我一直在尝试让它工作,但没有明显的原因,用于渲染每个效果的相同代码块只渲染第一个。我可以在第一个着色器文件中添加第二个着色器文件作为第二个通道,它运行完美(尽管完全违背了我预览用户创建的着色器的目标)。当我尝试使用第二个效果(加载和编译得很好)时,它什么也没做。我已经获取了第一个着色器的结果(使用 GetRenderTargetData)并将它们放置在纹理和表面(destTex 和 destSur)中,然后将该纹理设置为第二遍的输入(使用 dev->SetTexture 和后来的效果-> SetTexture("thisframe", destTex))。

所有调用成功,效果编译,纹理加载,四边形绘制,但效果不可见。起初我怀疑是设备(使用软件顶点处理创建)导致了问题,但似乎并非如此(我尝试使用硬件并混合)。此外,同时使用 HAL 和 REF 设备(不是问题,因为应用程序不是实时的),第二个着色器不可见。Direct3D 9 的一切都是用 C++ 编写的。

0 投票
2 回答
2767 浏览

glsl - 在球体上画圆

我正在尝试使用着色器在球体上绘制很多圆圈。基本算法是这样的:

  1. 计算从片段(使用它的纹理坐标)到圆心位置的距离(圆心也在纹理坐标中指定)
  2. 计算从碎片到圆心的角度。
  3. 根据角度,访问纹理(其中有 360 个像素,红色通道指定半径距离)并检索给定角度的半径
  4. 如果从片段到圆心的距离小于检索到的半径,则片段的颜色为红色,否则为蓝色。

我想画……在蓝色球体上画 60 个红色圆圈。我让 y 着色器为一个圆圈工作,但如何做 60?这是我到目前为止尝试过的......

  1. 我传入了一个指定给定角度半径的数据纹理,但我注意到伪影蔓延。我相信这是由于当我尝试使用以下方法从数据纹理中检索信息时的线性插值:

    其中角度是包含给定角度半径的数据纹理 (Sampler2D),x = 角度 / 360.0(角度为 0 到 360)和 y = 0 到 60(y 是圆数)

  2. 我尝试传入一个统一的浮点半径 [360],但我无法通过动态索引访问半径。我什至试过这个烂摊子......

    等等 ...

如果我创建一个纹理并将所有圆圈放在该纹理上,然后将蓝色球体与包含圆圈的球体进行多重纹理处理,但正如您所料,我的锯齿非常糟糕。我喜欢根据片段的位置和圆的位置在程序上生成圆的想法,因为几乎没有混叠。但是,我做的不止一个吗?

谢谢!!!

〜螺栓

0 投票
4 回答
6734 浏览

macos - OS X 上的 GLSL 着色器开发有哪些选择?

Apple 的 Shader Builder 并不是非常先进。我想知道除了在 bootcamp 下运行某些东西之外,OS X 是否还有更好的选择。

0 投票
2 回答
1321 浏览

directx - DirectX 9:顶点着色器属性源

那是关于 DirectX 9。

在使用顶点着色器进行渲染的典型情况下,设备中设置了一个或多个流源,并且源数据的格式使用顶点声明来定义。

现在,如果使用的顶点着色器需要某个属性(例如,具有 D3DDECLUSAGE_NORMAL 和 UsageIndex 1 或 2 的属性),但提供的顶点声明不包含该属性(即流源中提供的数据不包含该属性),然后调用 DrawPrimitive,DirectX 在哪里获取该属性的值?

0 投票
2 回答
1499 浏览

opengl - 一般如何使用着色器制服?

着色器可以有很多不同的统一名称+属性。如何制作一个在一般情况下工作的系统,这样我就不必事先知道每个着色器制服的名称并将其硬编码为代码以获取其位置。我使用 OpenGL。

0 投票
2 回答
5197 浏览

math - 将深度纹理样本转换为距离

我目前正在使用以下 GLSL 代码在后处理景深着色器中读取深度纹理:

然后根据近、远平面距离将深度值转换为视空间距离:

这一切似乎都运行得很好,但是我很想知道如何仅基于当前投影矩阵进行上述计算,而不需要单独的zNearzFar值。

我最初的尝试涉及乘以(vec4(tcscreen.x, tcScreen.y, depth, 1.0) * 2.0 - 1.0)投影矩阵的倒数,将结果除以w,然后将结果z值作为距离,但这似乎不起作用。这里的正确方法是什么?

此外,当使用斜截头截体剪裁将近平面移动到选定的剪裁平面上时,现在每个像素的近平面距离是否可能不同?如果是这样,那么这是否意味着任何计算与深度纹理的距离的着色器都需要了解这种情况,而不是假设一个恒定的近平面距离?

谢谢!