Articles of 着色器

OpenGL脸部顺序

我写了一个简单的OBJ文件加载器来使用OpenGL渲染网格。 但是显示加载的网格有一个问题。 看起来,从背景(远)的面孔显示在正面上方。 为了说明问题,我已经提供了一个小示例图片(搅拌机猴子)。 我正在使用真正简单的着色器: 顶点着色器 #version 330 layout (location = 0) in vec3 vert; layout (location = 1) in vec2 uv; uniform mat4 model; uniform mat4 view; uniform mat4 projection; out vec2 frag_uv; out vec3 frag_vert; void main() { gl_Position = vec4(vert, 1); gl_Position *= model; gl_Position *= view; gl_Position *= projection; frag_vert = […]

如果我的点光源位于世界原点(0,0,0),我的点光源阴影才真正有效。

当我移动灯光时,阴影将会分裂,好像它们的遮挡物在某些区域没有遮挡住它们。 例如,在下面的场景中,我沿着Z轴移动了一个400个单位的点光源,我得到了这样一个场景,不知何故被遮挡的碎片正在通过阴影testing: 阴影贴图纹理对我来说很好。 由于我正在使用点光源,所以我需要一个立方体贴图,所以这里是贴图的相关部分: 我相当肯定我的问题必须在我的着色器之一。 我的指示灯的阴影逻辑从片段的世界位置减去灯的位置,获取vec3的长度并将其作为FragColor输出。 #version 330 in vec3 WorldPos; // aka ViewMatrix*ModelMatrix*Vertex layout (location = 0) out float FragColor; uniform vec3 LightPos; void main() { vec3 LightToVertex = WorldPos – LightPos; float LightToPixelDistance = length(LightToVertex); FragColor = LightToPixelDistance; } 然后在实际的照明逻辑中,我这样做来计算一个阴影因子(其中1.0 ==全光照,0.0 ==全黑) uniform samplerCubeShadow ShadowMap; in vec3 WorldPos; float CalcShadowFactor() { vec3 LightDirection […]

将噪点纹理自动映射到3D模型上

我想对物体应用一种噪声/灰尘纹理,使其看起来很好,并且不需要在模型中进行UV映射。 这是因为我想有可能将这个应用到任何对象,尽管他们已经有一些其他的纹理。 只是为了让任何东西看起来很脏。 因为这是噪音types的纹理,所以不需要在脸部之间缝好。 优先级是纹理比例被保留。 在顶点着色器中,我有顶点坐标以及正常,副法线和正切。 我想到了将3D顶点坐标投影到由法线定义的平面上并从那里获取2d坐标,然后将它们用作UV。 但是要么我无法得到正确的方程式,要么不行。 我检查一个球体的结果,我总是得到纹理拉伸的地方。 有什么办法可以取得好成绩? 如果这个问题我使用XNA / Monogame,C#,HLSL。 更新:我发现这个: 计算旋转matrix以在3D中将向量Aalignment向量B? https://math.stackexchange.com/questions/180418/calculate-rotation-matrix-to-align-vector-a-to-vector-b-in-3d/897677#897677 我认为这可以工作: 寻找旋转matrix,它将平面旋转到(0,1,0) 使用这个matrix来旋转当前的顶点位置。 从(u,v)的旋转位置取(x,z)。 然而,如果这些方程式我的math技能是不够的,使algorithm。 这会工作吗?

OpenGL:深度和文字渲染的奇怪之处

TL; DR我一如既往地用M,V,Pmatrix来渲染场景。 比我没有任何matrix渲染的东西(在这种情况下 – 文本),并使用单独的着色器对坐标与Z = -1。 不知何故,它比Z = 0.9坐标上的东西更接近相机。 我不明白为什么。 这是我无法弄清楚的。 考虑用于文本渲染的顶点着色器: #version 330 core layout(location = 0) in vec2 vertexPos; layout(location = 1) in vec2 vertexUV; out vec2 fragmentUV; void main() { fragmentUV = vertexUV; gl_Position.x = vertexPos.x*2 – 1; gl_Position.y = vertexPos.y*2 – 1; gl_Position.z = -1.0; gl_Position.w = 1.0; } 当Z […]

Unity Shader材质仅在点击时激活

我目前正在编程设置一些着色器纹理,与网格filter有关。 网格filter使用标准着色器,我只是通过代码生成并设置凹凸和高度贴图。 Sphere.materials [0].mainTexture = biome; Sphere.GetComponent<MeshRenderer> ().materials [0].SetTexture ("_BumpMap", bump); Sphere.GetComponent<MeshRenderer> ().materials [0].SetTexture ("_ParallaxMap", heightTexture); 这可以。 问题在于着色器只能在检查器中单击后才激活。 是否有某种Activate()函数需要调用才能将着色器效果应用到网格? 在示例中注意(这是在Play模式下运行),只要点击检查器中Shader的展开button,着色器就会激活。 这里发生了什么?

一个顶点的统一几何graphics

Hy,我想用Unity中的geometryshader构建一些几何体。 我看了看这个 。 我想在3D空间(x,y,z)中的一个点上下文中创建我的几何graphics。 我可以以某种方式使用变换位置向量作为着色器的input值吗? 或者有什么像我可以使用的一个顶点网格? 我在Blender中试过这个 ,但是没有把那个Vertex网格导入到Unity中。 谢谢你的帮助!

统一几何着色器永久编译

我正在写一个着色器来实现一个激光表演效果的例子 。 现在我只关注线条。 一条线表示为一个三角形。 当我保存我的shadercode时,unity变得不活跃,我可以在任务管理器中看到着色器编译器有30%的cpu – >正在编译。 但是这需要永远,当我重新启动统一,它不能够从资产加载着色器。 我发现,当我评论这行时,不会发生这种情况: const int TRI_STRIP[TAM] = tmpTriStrip; 显然,我得到一个错误,TRI_STRIP是未定义的,但着色器编译器做了工作,Unity仍在运行。 然后我把代码放回到上面的desribed行为出现。 感谢您的任何提示和建议。 这里是完整的geometryshader代码: void myGeometryShader(point gIn vert[1], inout TriangleStream<v2f> triStream) { float f = _PointSize / 20.0f * sin(_Time * _Speed); //half size float4 vctmp[TAM]; int i; float y; for (i = 0; i < TAM; i += 3) { […]

C ++ .obj加载器中的现代OpenGL项目

我想在c ++中创建一个以obj格式加载模型的类。模型从Blender(3D建模程序)中生成。当我尝试在屏幕上没有类的时候绘制一些东西(所有的代码都是主要的)但是不知何故,我的class级没有工作。它只显示一个黑色的屏幕。这里我的代码: main.cpp中 #include "global.h" using namespace std; int main() { glewExperimental = GL_TRUE; glewInit(); glViewport(0,0,800,800); mesh.loadMesh("models/1/cube.obj"); shaders.push_back(Shader("shaders/default/default.vert", "shaders/default/default.frag")); while (window.isOpen()) { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); while (window.pollEvent(Event)) { if (Event.type == sf::Event::Closed) window.close(); } mesh.draw(shaders[0]); window.display(); } return 0; } 顶点着色器 layout (location = 0) in vec3 position; layout (location = 1) in vec3 normal; layout (location […]

高斯模糊spritesheet /纹理地图集没有剪报边缘

我正在试图将一个高斯模糊应用到一个阴影中,使它们变得柔和一些。 我可以使用模糊罚款,但问题是,我结束了这个: 而不是这个: 这不是很好。 该图像是在每个框架周围具有单个像素排水沟的spritesheet的一部分。 我不想回去添加足够大的水槽,以适应每个spritesheet的每一帧的模糊。 另外,由于精灵必须sorting的方式,我无法将所有阴影渲染到渲染目标,然后模糊整个目标。 我可以达到我想要的一个精灵作为一个单一的形象,而不是作为一个spritesheet的效果。 我通过创建比他们需要的大20%的三角形来实现这一点,然后在UV寻址设置为钳位时对边界外的纹理进行采样。 这不适用于spritesheet,因为它只是开始对当前帧两侧的帧进行采样。 有没有办法实现我想要的着色器或其他欺骗? 我真的不想改变每个spritesheet。

如何计算着色器中的2D视口坐标?

在Unity中,我使用以下着色器来计算2D视口坐标: Shader "Foo" { SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag struct vertInput { float4 pos : POSITION; }; struct vertOutput { float4 pos : SV_POSITION; float4 uv : TEXCOORD0; }; vertOutput vert (vertInput input) { vertOutput o; o.pos = mul(UNITY_MATRIX_MVP, input.pos); o.uv = mul(UNITY_MATRIX_MVP, input.pos); return o; } fixed4 frag […]