【问题标题】:OpenGL Missing Triangles Diffuse ShaderOpenGL 缺少三角形漫反射着色器
【发布时间】:2014-05-30 14:27:06
【问题描述】:

我使用的是 C++,当我实现漫反射着色器时,它会导致其他所有三角形消失。

如果需要,我可以发布我的渲染代码,但我认为问题在于我的普通矩阵(我将其写为模型视图矩阵的转置逆矩阵)。这是一个类似于灯塔教程的着色器代码。 顶点着色器

#version 330

layout(location=0) in vec3 position;
layout(location=1) in vec3 normal;

uniform mat4 transform_matrix;
uniform mat4 view_model_matrix;
uniform mat4 normal_matrix;
uniform vec3 light_pos;

out vec3 light_intensity;

void main()
{
    vec3 tnorm = normalize(normal_matrix * vec4(normal, 1.0)).xyz;
    vec4 eye_coords = transform_matrix * vec4(position, 1.0);
    vec3 s = normalize(vec3(light_pos - eye_coords.xyz)).xyz;

    vec3 light_set_intensity = vec3(1.0, 1.0, 1.0);
    vec3 diffuse_color = vec3(0.5, 0.5, 0.5);

    light_intensity = light_set_intensity * diffuse_color * max(dot(s, tnorm), 0.0);
    gl_Position = transform_matrix * vec4(position, 1.0);
}

我的片段着色器只是以颜色的形式输出“light_intensity”。我的模型直接来自 Blender,我尝试了不同的导出选项,例如保持顶点顺序,但没有任何效果。

【问题讨论】:

  • 尝试更改其中一个三角形中顶点的顺序。好像是个绕线的问题
  • 你指的是换模型吗?
  • 是的,你的脸似乎不遵循同样的曲折,试着用你的顶点顺序玩一下
  • 我认为问题不在于您的普通矩阵。如果那是错误的,你所有的三角形都会得到错误的照明,其中一半是正确的。我怀疑问题在于法线指向错误的方向。这类似于@HarrisonG16 建议的缠绕问题。但是如果缠绕错误,并且您启用了背面剔除,则根本不会绘制三角形。它们在这里显示为黑色,因此不会被淘汰。您的建模软件有什么方法可以显示法线吗?它们都应该指向外面。
  • 以@RetoKoradi 所说的为基础,我编写了一个着色器来输出 r、g 和 b 通道中法线的 x、y 和 z。我发现这是仔细检查法线的好方法。

标签: c++ opengl sdl blender


【解决方案1】:

这与你的着色器无关。

这似乎与深度测试有关。在这里,相对于您的视口的深度三角形的顺序是混乱的,因为您不能确保只绘制离您的相机最近的像素。

启用深度测试并确保将 z 缓冲区绑定到渲染目标。 在此处阅读更多信息:http://www.opengl.org/wiki/Depth_Test

只有以红色突出显示的三角形对查看者可见。由于缺乏有效的深度测试,因此无法保证最上面绘制的三角形是什么。因此,不应可见的面的蓝色三角形将覆盖先前绘制的红色三角形的部分。

深度测试将省略这一点,通过比较 z 缓冲区中的深度与当前时刻要绘制的像素的深度。只有更靠近观察者的像素的颜色信息,即具有小于缓冲区中 z 值的 z 值,才应写入帧缓冲区,以获得正确的结果。

(背面剔除,也不错,如果模型正确导出,也可以正确显示它。但它只会隐藏主要问题,而不是解决它。)

【讨论】:

  • 不确定,一些深度测试似乎效果很好(看顶面)
  • 顶面可能是运气。它恰好是最后一张脸。 (可以覆盖顶面的面)
  • 只有左前脸会导致思考深度测试问题,我不太相信
  • 为什么只有左脸?每个基元似乎都来自立方体,它们的绘制顺序是违反直觉的。但仍然有意义,例如右下三角形绘制得比较晚(如果不是最后一个三角形)。使用索引(始终将整个三角形移动在一起,假设您有一个每个面的索引),您会得到不同的结果。
  • 因为左前方有一个奇怪的ghost顶点出现在左上段的中间。我认为这可能是由于:距离相机最近的顶点可能根本没有链接(错误的索引),但最远的顶点被替换了(不确定它是否清楚)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-08
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
  • 1970-01-01
相关资源
最近更新 更多