Articles of glsl

glsl预期的标记')',find与标识符'function混合

我有一个片段着色器包含: […] float c = texture2D(tex, tc).a; float alpha = mix(0.0f, 1.0f, c); gl_FragColor = vec4(1, 1, 1, alpha) * color; 这在我的桌面和Nexus 5上正常工作。但是,我在运行Wiko手机时遇到exception: 0:22: L0001: Expected token ')', found 'identifier' 第22行是包含混合function的行。 我做错了什么?

SFML / GLSL中的轮廓着色器不起作用

我有一个SFML的问题。 此代码不起作用: uniform sampler2D texture; varying vec2 v_texCoords; float offset = 1.0/32; void main() { v_texCoords = gl_TexCoord[0].xy vec4 col = texture2D(texture, v_texCoords); if (col.a == 1) gl_FragColor = col; else { float au = texture2D(texture, vec2(v_texCoords.x , v_texCoords.y -offset )).a; float ad = texture2D(texture, vec2(v_texCoords.x , v_texCoords.y + offset)).a; float al = texture2D(texture, vec2(v_texCoords.x […]

纯金属reflection率的基本方程

我正在做一个活的壁纸,显示一个纯粹的金属物体。 由于它是一个dynamic壁纸,我可以做大量的近似…这不是一个游戏世界的完整场景。 我的着色器只需要支持这一个材质。 人们不会期望极端的细节等等。所以,例如,我甚至不用担心散射,因为纯粹的导电材料几乎没有。 所以我试图实现一个reflection的导电表面,从表示照明环境的立方体贴图中拉出reflection。 在一个非常基本的层面上看起来像这样: vec3 fresnelSchlick (vec3 f0, float cosTheta) { return mix(f0, vec3(1.0), pow(1.0 – cosTheta, 5.0)); } //… float NdV = dot(normal, viewDir); vec2 brdf = texture2D(u_brdf, vec2(u_roughness, NdV)).rg; // from a LUT vec3 reflection = textureCube(u_cubemap, reflect(viewDir, normal)); gl_FragColor = reflection * (fresnelSchlick(materialColor, NdV) * brdf.x + brdf.y); 这里我简单的math问题是,可能的最终像素颜色的范围不会产生一个适当的色调范围。 假设我的素材颜色是#0050ff,环境是单色的白色。 […]

GLSL中的统一布局限定符如何分开?

所以对于属性来说,索引之间的间隔是vec4,所以如果我有2个matrix作为属性,他们将在mat4中布局(位置= 0),在mat4中 布局(位置= 4) 如果我为2个统一的matix做同样的事情,matrixb的索引是什么? 注意:用OpenGL 4,VBOs也属性,顶点没有关键词吗?

有没有与GLSL的“地图”function相当的HLSL?

Google在这方面并没有帮助我。 这是GLSL着色器: vec3 globalIllumination(vec3 p, vec3 n) { vec3 g = vec3(0.0); float dist; for (float i = 1.0; i <= samples; i++) { dist = stepDistance * i; float d = vec3(dist – map(p + n * dist, returnColor)); g += returnColor*d/ i; } return g; } 我知道如何将其转换为HLSL,除了该地图function。 我可以使用一些帮助。

3D模型呈现在半色调

我正在写一个3D渲染器,可以渲染3D模型,就好像它们是用半色调绘制的一样。 function明智我不需要任何花哨 – 没有颜色,只是纯粹的3D几何和基本的照明,就像这里: 图片来源: https : //blenderartists.org/forum/showthread.php?438820-Suzanne-Sketch 笔记: 过去我已经写了一个基本的3D渲染器,但是在着色器方面我真的缺乏经验(再次,我知道基础知识),我完全不知道从哪里开始。 示例图像已在Blender中创建,但是我正在编写自定义渲染器。 这不是“ 我怎样才能使着色效果看起来像铅笔素描? ”,因为我的input是一个3D模型,而链接的问题中的OP使用了一个图像。

如何渲染一个由单独可变形部件组成的模型?

考虑一个由身体和八条腿组成的蜘蛛的3D模型。 腿可以相对于身体转换(旋转)。 我不确定渲染这种场景的常见方式是什么,处于较低水平。 我可以想到两种方法: 使用不同的维也纳国际中心(或不同的指标)(身体一个,腿一个)和独立的绘图调用分别渲染身体和腿部。 对每个顶点所属的主体部分进行编码,并根据此信息决定如何对顶点着色器中的顶点进行变换。 我search了一下,可以find关于骨骼animation和类似技术的一些教程,但是他们仍然归结为这个问题。

转换gl_TexCoord .st以匹配版本#330

我目前正在一个基于sfml的库,我正在实现与着色器的小部件。 我在sfml中定义了一个位置和texcoord的四元组,以使着色器适用于这个对象: quad[0].position = sf::Vector2f(100, 100); quad[0].texCoords = sf::Vector2f(0, 0); quad[1].position = sf::Vector2f(410, 100); quad[1].texCoords = sf::Vector2f(1, 0); quad[2].position = sf::Vector2f(410, 410); quad[2].texCoords = sf::Vector2f(1, 1); quad[3].position = sf::Vector2f(100, 410); quad[3].texCoords = sf::Vector2f(0, 1); 这样我就可以使gl_TexCoord[0].st准备好使用,而不用分辨率来分割它,使其处于愤怒[0, 1] 。 但是,当我添加#version 330时,我得到一个deprection错误。 由于我使用的是OpenGL 3.3,所以我希望坚持使用现代着色器方法,并避免弃用的东西。 以下是我的着色器的外观和工作原理,没有版本定义: void main() { vec2 pos = gl_TexCoord[0].st; // deprecated since #120 gl_FragColor = […]

你能以数组的forms访问传入GLSL的顶点吗?

所以在顶点着色器中,我接收到我的顶点数据为: layout(location = 0) in vec3 position; //(x,y,z) coordinates of a vertex layout(location = 1) in vec3 norm; //a 3D vertex representing the normal to the vertex layout(location = 2) in vec2 texture_coordinate; // texture coordinates 特别是我想访问的前两个领域,如果他们是arrays(想象一下SSBO)。 这是因为我需要的网格信息不仅要呈现网格本身,而且还要阴影(阴影)。 一个明显的解决scheme是简单地传递网格数据以及SSBO,但是这意味着现在我已经将两次相同的信息传递给GPU一次作为渲染的顶点,一次作为网格数据。 我想能够访问所有的顶点数据,就好像它是一个数组,这是可能的吗?

GLSL光着色被遮挡的表面

我创建了一个非常简单的照明着色器。 目前它只支持点光源,但它会照亮完全被光线遮挡的表面。 我知道为什么,但我想知道如何解决这个问题。 我正在考虑使用阴影映射的forms来使这些区域变暗,但阴影映射对于我来说是难以理解的,并且具有非常重要的性能问题。 我希望能有一个更优雅,更高效的版本,即使它不太好。 直到类似的东西存在,我需要一个很好的,有效的方式来检查一个片段或顶点是否可见,并从那里计算事物。 我还想补充一点,我打算支持半透明的对象,它应该基于和alpha值来阻挡光线。 我想要的东西: 快速(25+ fps与修改着色器,我目前运行在82) 很容易修改,以包含更多的灯(最多三个或四个,可能)。 支持边缘平滑(用户可以启用它,但会失去性能) 我不想要的东西: 在渲染过程中从GPU拉取信息(当发生这种情况时,视图的口吃始终是可见的) 当场景静止时,可见/明显的照明移动(如光线在真的不在,由于随机化) 当场景第一次渲染时,昂贵的操作。 我不指望有人执行这些事情 – 只是留下空间,可能会在这些地方做出评论。 我知道这是与凹凸贴图等结合的渲染的“圣杯”,但是如果你稍微淡化一下质量,我希望这是可能的。 我可能不得不在CPU上做一些额外的工作,但这是可以接受的。 现在我正在工作的着色器: 顶点着色器 varying vec4 color; varying vec3 normal; varying vec4 position; void main (void) { color = gl_Color; // pass color to the fragment shader normal = normalize(gl_NormalMatrix * gl_Normal); // calculate useable normals […]