opengl中3d空间平面上的程序网格
Posted
技术标签:
【中文标题】opengl中3d空间平面上的程序网格【英文标题】:Procedural grid on a plane in 3d space in opengl 【发布时间】:2020-11-05 14:36:21 【问题描述】:我有一个用 c++ 编写的简单图形程序,它使用 opengl 进行渲染。我有一个在原点绘制的平面,我想向它添加程序网格纹理。在我当前的片段着色器中,我只做一些光照计算:
#version 330 core
out vec4 FragColor;
in vec3 Normal;
in vec2 TexCoord;
in vec3 FragPos;
uniform vec3 objectColor;
uniform vec3 lightColor;
uniform vec3 lightPos;
void main()
float ambientStrength = 0.5;
vec3 ambient = ambientStrength * lightColor;
vec3 norm = normalize(Normal);
vec3 lightDir = normalize(lightPos - FragPos);
float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = diff * lightColor;
vec3 result = (((ambient + diffuse) * objectColor) * 0.5) ;
FragColor = vec4(result, 1.0);
我的问题是,如果修改片段着色器是在我的平面上拥有程序网格的最佳方式,那么我应该如何编写这样的着色器?
【问题讨论】:
既然你已经有了 texcoord 属性,你需要创建纹理,用数据填充它,将它绑定到一个纹理单元,创建一个统一的采样器变量,将它的值设置为指向适当的纹理单元,对纹理进行采样并将结果与您当前的代码相结合。除非您根本不想使用纹理,在这种情况下您可以直接将生成放在片段着色器中。 @BartekBanachewicz 感谢您的建议。我不想使用纹理,但我正在努力在片段着色器中生成网格。 【参考方案1】:最简单的方法是使用三角函数。因为你已经在传递纹理坐标了。
设颜色强度为max(cos(u), cos(v))
。这会给你一个开始。然后你应该使用 cos 公式来得到你想要的结果(即乘以一些系数并对其应用幂,直到它看起来完全符合你的需要)。
【讨论】:
嗨@Makogan。谢谢你的建议。上面提供的示例代码中的“u”和“v”代表什么? u 和 v 纹理坐标,即纹理坐标输入到着色器的第一个和第二个分量 非常感谢,它正在工作。完成后我会尝试添加完成的着色器程序。 如果它解决了您的问题,请考虑给它一个赞:)。以上是关于opengl中3d空间平面上的程序网格的主要内容,如果未能解决你的问题,请参考以下文章