Questions tagged «glsl»

OpenGL着色器的编程语言。

1
GLSL,全部包含在一个或多个着色器程序中?
我正在使用OpenGL进行一些3D演示,我注意到GLSL有点“受限”(或者仅仅是我吗?)。无论如何,我有许多不同类型的材料。某些材质具有环境和漫反射颜色,某些材质具有环境光遮挡贴图,某些材质具有镜面贴图和凹凸贴图等。 是最好在一对顶点/片段着色器对中支持所有对象,还是更好地创建许多顶点/片段着色器并根据当前选择的材质进行选择?OpenGL或D3D中通常的着色器策略是什么?
17 opengl  3d  shaders  glsl 

2
OpenGL:VBO或glBegin()+ glEnd()?
最近,我将原始OGL红皮书的读者链接到了教程站点。向下的第三个标头明确表示忘记了glBegin()和glEnd()作为典型的渲染方法。我是通过Redbook的方法学习的,但我发现VBO有一些好处。这真的是可行的方法吗?如果是,是否有一种方法可以轻松地将渲染代码和后续的着色器转换为VBO和后续的数据类型?
16 opengl  graphics  glsl  vbo 

2
RenderMonkey是否有继任者?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为Game Development Stack Exchange 的主题。 5年前关闭。 我从GLSL着色器编程开始,一直在研究RenderMonkey。可悲的是,AMD不再支持它。为什么?是否有继任者?
16 shaders  glsl 

2
线宽可变的卡通/透明阴影?
我看到一些进行cel着色的广泛方法: 具有翻转法线的模型的复制和放大(对我而言不是一种选择) Sobel滤波器/片段着色器进行边缘检测的方法 模板缓冲区方法进行边缘检测 用于计算面法线和边缘法线的几何(或顶点)着色器方法 我是否假设以几何为中心的方法也可以最大程度地控制照明和线条粗细,这是正确的吗?对于可能会看到山的轮廓线逐渐合并成平原的地形? 如果我不需要地形表面的像素照明怎么办?(而且我可能不会,因为我计划使用基于单元的基于顶点或基于纹理贴图的照明/阴影。)那么我是否会更好地坚持使用几何类型方法,或者改为使用屏幕空间/片段方法?使事情更简单?如果是这样,我怎么会得到山上的“墨” 内网的剪影,而不是只有整个网格(的轮廓与轮廓内没有“墨水”的细节?(AKA 暗示的轮廓,折痕)。 最后,是否可以使用几何着色器廉价地模拟翻转法线方法?我对此的担心是,我当然可以复制每个单个顶点并相应地缩放它们,但是我将如何处理翻转法线和片段着色器中的不同着色? 我想要的-在轮廓内插入线来改变线的粗细... 我不要... 编辑:进一步的研究发现了以下... 由于我在地形上拥有大量顶点,因此即使考虑基于距离的LoD,由于所有对象的复制和缩放都涉及巨大的计算复杂性,因此无论是基于翻转法线还是基于几何着色器的方法(即使使用平截头体剔除)都不是明智的选择。上传的顶点。 考虑到我不需要在地形表面上以纯色阴影的形式进行逐像素照明,因此考虑基于面部法线的方法(否则需要正确的表面照明)也变得不太谨慎计算起来自然很昂贵。但是,他们确实提供了最好的控制权。例如,使用“艺术”笔触为边缘着色的能力:漂亮,但又不能在大规模复杂的游戏环境中真正实现。 我宁愿避免使用模板缓冲区,因为我希望在着色器中完成所有工作。(上面带有红色轮廓的示例是使用模板缓冲区-旧学校完成的。) 这样就留下了片段着色器的图像空间方法。计算复杂度降低为片段的数量,而不是顶点的数量(在我的情况下,这比几何着色器中的操作要少10-100倍)。为了生成一个g缓冲区(包括一个普通缓冲区和一个可选的深度缓冲区),需要多次渲染渲染,我们可以将不连续性滤镜(例如Sobel运算符)应用到该缓冲区。深度不连续性使轮廓和折痕产生暗示。我唯一的疑问是无法对墨迹边缘宽度进行更好的控制,尽管使用片段着色器中的正确算法,我相信这是可能的。 因此,现在的问题变得更加具体:我如何精确地在片段着色器中获得可变的边缘宽度,尤其是在外部轮廓上?

1
使用GLSL 330版实现Skybox
我正在尝试让Skybox使用OpenGL 3.3和GLSL 330版。 我在网络上的任何地方都找不到完整的现代OGL skybox教程,因此我对一个较旧的版本进行了现代化(使用glVertexAttribPointer()而不是gl_Vertex用于顶点等)。它主要在工作,但是有两个主要细节: 天空盒更像天空三角形,纹理严重扭曲和拉伸(它们应该是星场,我在黑色背景上看到线条)。我99%确信这是因为我没有完全正确移植旧教程。 这是我的Skybox类: static ShaderProgram* cubeMapShader = nullptr; static const GLfloat vertices[] = { 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, …
14 c++  opengl  glsl  cubemap  skybox 

2
GLSL着色器-更改色相/饱和度/亮度
我正在尝试使用GLSL片段着色器更改图像的色调。我想实现类似于Photoshop的“色相/饱和度调整”层的功能。 在下图中,您可以看到到目前为止我得到了什么。我想更改绿色正方形的色相,使其看起来像右边的红色正方形,但是使用此着色器,我得到一个半红色的半粉红色正方形(中间的正方形)。 我在片段着色器中所做的就是将纹理的颜色转换为HSV,然后将从顶点着色器获得的HSV颜色添加到其中,然后将颜色转换回RGB。 我究竟做错了什么? 片段着色器: precision mediump float; varying vec2 vTextureCoord; varying vec3 vHSV; uniform sampler2D sTexture; vec3 convertRGBtoHSV(vec3 rgbColor) { float r = rgbColor[0]; float g = rgbColor[1]; float b = rgbColor[2]; float colorMax = max(max(r,g), b); float colorMin = min(min(r,g), b); float delta = colorMax - colorMin; float …


4
调试着色器代码?
我正在编写一个游戏引擎,当我使用透视相机时,屏幕会黑屏。我不会确切地问这是为什么,因为会有很多代码要共享,并且坦率地说,我认为即使打扰大家,这也是一个小问题。 麻烦在于我不知道如何调试它。所有更改都是我的投影矩阵,如果我的投影矩阵看起来不错,我不知道为什么它不起作用。理想情况下,我将在着色器进行计算时打印出各种东西的值,但是GLSL不方便地没有printf()函数。 所以我的问题是:如何调试我的问题?我唯一想到的就是在客户端检查尽可能多的值,然后通过置换进行编程,但是我这样做并没有成功。有什么方法可以查看视频卡中发生的情况?我可以使用一种完全不同的技术吗? 我使用的是GLSL 420版(以及该版本的特定功能),因此考虑到上次更新是2010年,我不认为glslDevil是一个选项。 编辑 我设法通过一些完全不相关的调试解决了我的问题。

1
OpenGL / GLSL:渲染到立方体贴图?
我试图弄清楚如何将场景渲染为立方体贴图。我在这个问题上停留了一段时间,以为我会向你们寻求帮助。我是OpenGL的新手,这是我第一次使用FBO。 我目前有一个使用cubemap bmp文件的工作示例,片段着色器中的samplerCube样本类型附加到GL_TEXTURE1。我根本没有更改着色器代码。我只是改变了一个事实,即我不会调用正在加载cubemap bmp文件的函数,而是尝试使用以下代码来渲染到cubemap。 您可以在下面看到我还将纹理再次附加到GL_TEXTURE1。在设置制服时是这样的: glUniform1i(getUniLoc(myProg, "Cubemap"), 1); 它可以通过在我的片段着色器中访问它uniform samplerCube Cubemap。 我这样调用以下函数: cubeMapTexture = renderToCubeMap(150, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE); 现在,我意识到在下面的绘制循环中,我没有更改视图方向来向下看+ x,-x,+ y,-y,+ z,-z轴。我真的只是想在实现之前先看到一些东西。我认为我至少应该像现在的代码一样在对象上看到一些东西。 我什么也没看见,只是黑色。我将背景设为白色,但物体仍为黑色。我删除了照明和着色,仅对立方体贴图纹理进行采样,并且仍然为黑色。 我认为问题可能是设置纹理时的格式类型,即GL_RGB8,GL_RGBA,但我也尝试过: GL_RGBA,GL_RGBA GL_RGB,GL_RGB 我认为这是标准的,因为我们正在渲染附加到帧缓冲区的纹理,但是我看到了使用不同枚举值的不同示例。 我还尝试在每个要使用立方体贴图的绘制调用中绑定立方体贴图纹理: glBindTexture(GL_TEXTURE_CUBE_MAP, cubeMapTexture); 另外,我没有为大多数示例中看到的FBO创建深度缓冲区,因为我只想为我的立方体贴图使用颜色缓冲区。我实际上添加了一个,看是否是问题所在,但仍然得到了相同的结果。当我尝试时,我可能会捏造出来。 可以为我指明正确方向的任何帮助将不胜感激。 GLuint renderToCubeMap(int size, GLenum InternalFormat, GLenum Format, GLenum Type) { // color cube map GLuint textureObject; int face; …
13 opengl  glsl  cubemap 

4
OpenGL多通道着色器如何工作?
在Direct3D中,多通道着色器易于使用,因为您可以从字面上定义程序中的通道。在OpenGL中,这似乎有点复杂,因为可以为着色器程序提供所需的任意数量的顶点,几何和片段着色器。 多遍着色器的流行示例是卡通着色器。一遍会产生实际的阴影效果,另一遍会创建轮廓。如果我有两个顶点着色器“ cel.vert”和“ outline.vert”,以及两个片段着色器“ cel.frag”和“ outline.frag”(类似于在HLSL中的处理方式),结合起来创建完整的卡通着色器? 我不想让您说可以使用几何着色器,因为我只想了解多通道GLSL着色器背后的理论;)
13 opengl  shaders  glsl 

1
SSAO实施未获得理想的结果
在实现了延迟渲染之后,我通过本教程尝试了SSAO实现。不幸的是,我没有得到任何看起来像SSAO的东西,您可以在下面看到我的结果。 您会看到有一些奇怪的图案形成,并且在需要的地方(即在物体之间和地面上)没有遮挡阴影。我实现的着色器如下: #VS #version 330 core uniform mat4 invProjMatrix; layout(location = 0) in vec3 in_Position; layout(location = 2) in vec2 in_TexCoord; noperspective out vec2 pass_TexCoord; smooth out vec3 viewRay; void main(void){ pass_TexCoord = in_TexCoord; viewRay = (invProjMatrix * vec4(in_Position, 1.0)).xyz; gl_Position = vec4(in_Position, 1.0); } #FS #version 330 core uniform …

2
如何使用GLSL创建高效的Bloom Shader?
我已经在网上搜索了与使用GLSL渲染光晕效果相关的资源,但没有发现任何东西。尽管Philip Rideout网站上的教程不错,但在我的Nvidia GPU上却表现不佳。 谁能指导我如何解决这个问题,并建立相当有效的布隆效应实现方法?
12 shaders  glsl  bloom 

1
什么是屏幕空间导数?何时使用它们?
我偶尔看到着色器代码中出现了ddx和ddyglsl函数以及hlsl等效项。我目前正在使用它们来进行不切线或不切线的凹凸贴图,但是我基本上是复制粘贴了代码。我不了解这些功能的实际含义,作用以及何时使用它们。 所以问题: 屏幕空间派生函数是什么? 这些功能做什么?输入值和输出值 它们最常用于什么效果? 什么样的效果需要您关注这些功能?

1
GLSL-在主要功能范围之外声明全局变量
在GLSL中声明超出主函数范围的变量是否有帮助?这些变量实际上是否可以重用并且效率更高? 这是有问题的代码: varying vec2 vposition; uniform float seed; uniform float top; uniform float bottom; uniform float phi; uniform float theta; uniform float scaledPI; uniform float yn; uniform float ym; uniform float rx; uniform float ry; uniform float radius; const float PI = 3.141592653589793238462643383; float left; float right; float mscaled; float …
12 glsl 

1
如何使用GLSL片段着色器实现这种波动?
所以我已经实现了反射部分: uniform sampler2D texture; uniform vec2 resolution; uniform vec3 overlayColor; void main() { vec2 uv = gl_FragCoord.xy / resolution.xy; if (uv.y > 0.3)// is air - no reflection or effect { gl_FragColor = texture2D(texture, vec2(uv.x, uv.y)); } else { // Compute the mirror effect. vec4 color = texture2D(texture, vec2(uv.x, 0.6 …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.