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空间平面上的程序网格的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 鼠标在 3D 空间中的位置

如何在opengl的3d空间中旋转单个形状?

OpenGL中的3D立方体网格

在 3D 空间中使用 GLSL 绘制 2D Mesh Grid

OpenGL Eight (Cube)

OpenGL ES——导入.stl格式的3D模型