GLSL、Opengl 中的视差贴图问题

2024-01-19

我的视差贴图给出了错误的结果。我不知道出了什么问题。

“影子”放错了地方。

光线从观察者处射向立方体。 Shader程序(基于dhpoware.com):

[vert]
     varying vec3 lightDir;            
     varying vec3 viewDir;
     attribute vec4 tangent;
     void main() 
     { 
     gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
     gl_TexCoord[0] = gl_MultiTexCoord0;
     vec3 vertexPos = vec3(gl_ModelViewMatrix * gl_Vertex);
     vec3 n = normalize(gl_NormalMatrix * gl_Normal);
     vec3 t = normalize(gl_NormalMatrix * tangent.xyz);
     vec3 b = cross(n, t) * tangent.w;
     mat3 tbnMatrix = mat3(t.x, b.x, n.x,
                           t.y, b.y, n.y,
                           t.z, b.z, n.z);
     lightDir = (gl_LightSource[0].position.xyz - vertexPos) / 1000.0;
     lightDir = tbnMatrix * lightDir;
     viewDir = -vertexPos;
     viewDir = tbnMatrix * viewDir;
     } 

    [frag]
     varying vec3 lightDir;            
     varying vec3 viewDir;
     uniform sampler2D diffuseMap;
     uniform sampler2D normalMap;
     uniform sampler2D heightMap;
     uniform float scale;
     uniform float bias;
     void main() 
     { 
     vec3 v = normalize(viewDir);
     vec2 TexCoord = gl_TexCoord[0].st;
    {
     float height = texture2D(heightMap, gl_TexCoord[0].st).r;
     height = height * scale + bias;
     TexCoord = gl_TexCoord[0].st + (height * v.xy); 
    }
     vec3 l = lightDir;
     float atten = max(0.0, 1.0 - dot(l, l));
     l = normalize(l);
     vec3 n = normalize(texture2D(normalMap, TexCoord).rgb * 2.0 - 1.0);
     vec3 h = normalize(l + v);
     float nDotL = max(0.0, dot(n, l));
     float nDotH = max(0.0, dot(n, h));
     float power = (nDotL == 0.0) ? 0.0 : pow(nDotH, gl_FrontMaterial.shininess);
     vec4 ambient = gl_FrontLightProduct[0].ambient * atten;
     vec4 diffuse = gl_FrontLightProduct[0].diffuse * nDotL * atten;
     vec4 specular = gl_FrontLightProduct[0].specular * power * atten;
     vec4 color = gl_FrontLightModelProduct.sceneColor + ambient + diffuse + specular;color *= texture2D(diffuseMap,TexCoord);
     gl_FragColor = color ;
     } 

来自立方体内容的日志(包括切线,第四个组成部分是用手习惯):

------------------------------------------------------------------------------------------------------------------
VecContainer<Vertex> vertices = 

size: 36
space: 36
{
-4.000000, -4.000000, -4.000000, 
-4.000000, 4.000000, -4.000000, 
4.000000, 4.000000, -4.000000, 
4.000000, 4.000000, -4.000000, 
4.000000, -4.000000, -4.000000, 
-4.000000, -4.000000, -4.000000, 
-4.000000, -4.000000, -4.000000, 
4.000000, -4.000000, -4.000000, 
4.000000, -4.000000, 4.000000, 
4.000000, -4.000000, 4.000000, 
-4.000000, -4.000000, 4.000000, 
-4.000000, -4.000000, -4.000000, 
-4.000000, -4.000000, -4.000000, 
-4.000000, -4.000000, 4.000000, 
-4.000000, 4.000000, 4.000000, 
-4.000000, 4.000000, 4.000000, 
-4.000000, 4.000000, -4.000000, 
-4.000000, -4.000000, -4.000000, 
4.000000, -4.000000, -4.000000, 
4.000000, 4.000000, -4.000000, 
4.000000, 4.000000, 4.000000, 
4.000000, 4.000000, 4.000000, 
4.000000, -4.000000, 4.000000, 
4.000000, -4.000000, -4.000000, 
-4.000000, 4.000000, -4.000000, 
-4.000000, 4.000000, 4.000000, 
4.000000, 4.000000, 4.000000, 
4.000000, 4.000000, 4.000000, 
4.000000, 4.000000, -4.000000, 
-4.000000, 4.000000, -4.000000, 
-4.000000, -4.000000, 4.000000, 
4.000000, -4.000000, 4.000000, 
4.000000, 4.000000, 4.000000, 
4.000000, 4.000000, 4.000000, 
-4.000000, 4.000000, 4.000000, 
-4.000000, -4.000000, 4.000000, 

}

------------------------------------------------------------------------------------------------------------------
VecContainer<Vertex> texcoords = 

size: 36
space: 36
{
0.000000, 0.000000, 
0.000000, 1.000000, 
1.000000, 1.000000, 
1.000000, 1.000000, 
1.000000, 0.000000, 
0.000000, 0.000000, 
0.000000, 0.000000, 
1.000000, 0.000000, 
1.000000, 1.000000, 
1.000000, 1.000000, 
0.000000, 1.000000, 
0.000000, 0.000000, 
0.000000, 0.000000, 
1.000000, 0.000000, 
1.000000, 1.000000, 
1.000000, 1.000000, 
0.000000, 1.000000, 
0.000000, 0.000000, 
1.000000, 0.000000, 
1.000000, 1.000000, 
0.000000, 1.000000, 
0.000000, 1.000000, 
0.000000, 0.000000, 
1.000000, 0.000000, 
0.000000, 1.000000, 
0.000000, 0.000000, 
1.000000, 0.000000, 
1.000000, 0.000000, 
1.000000, 1.000000, 
0.000000, 1.000000, 
0.000000, 0.000000, 
1.000000, 0.000000, 
1.000000, 1.000000, 
1.000000, 1.000000, 
0.000000, 1.000000, 
0.000000, 0.000000, 

}

------------------------------------------------------------------------------------------------------------------
VecContainer<Vertex> normals = 

size: 36
space: 36
{
0.000000, 0.000000, -1.000000, 
0.000000, 0.000000, -1.000000, 
0.000000, 0.000000, -1.000000, 
0.000000, 0.000000, -1.000000, 
0.000000, 0.000000, -1.000000, 
0.000000, 0.000000, -1.000000, 
0.000000, -1.000000, 0.000000, 
0.000000, -1.000000, 0.000000, 
0.000000, -1.000000, 0.000000, 
0.000000, -1.000000, 0.000000, 
0.000000, -1.000000, 0.000000, 
0.000000, -1.000000, 0.000000, 
-1.000000, 0.000000, 0.000000, 
-1.000000, 0.000000, 0.000000, 
-1.000000, 0.000000, 0.000000, 
-1.000000, 0.000000, 0.000000, 
-1.000000, 0.000000, 0.000000, 
-1.000000, 0.000000, 0.000000, 
1.000000, 0.000000, 0.000000, 
1.000000, 0.000000, 0.000000, 
1.000000, 0.000000, 0.000000, 
1.000000, 0.000000, 0.000000, 
1.000000, 0.000000, 0.000000, 
1.000000, 0.000000, 0.000000, 
0.000000, 1.000000, 0.000000, 
0.000000, 1.000000, 0.000000, 
0.000000, 1.000000, 0.000000, 
0.000000, 1.000000, 0.000000, 
0.000000, 1.000000, 0.000000, 
0.000000, 1.000000, 0.000000, 
0.000000, 0.000000, 1.000000, 
0.000000, 0.000000, 1.000000, 
0.000000, 0.000000, 1.000000, 
0.000000, 0.000000, 1.000000, 
0.000000, 0.000000, 1.000000, 
0.000000, 0.000000, 1.000000, 

}

------------------------------------------------------------------------------------------------------------------
VecContainer<tangent>* tangents = 

size: 36
space: 36
{
1.000000, -0.000000, 0.000000, 1.000000, 
1.000000, -0.000000, 0.000000, 1.000000, 
1.000000, -0.000000, 0.000000, 1.000000, 
1.000000, -0.000000, 0.000000, 1.000000, 
1.000000, -0.000000, 0.000000, 1.000000, 
1.000000, -0.000000, 0.000000, 1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
0.000000, 0.000000, 1.000000, -1.000000, 
0.000000, 0.000000, 1.000000, -1.000000, 
0.000000, 0.000000, 1.000000, -1.000000, 
0.000000, 0.000000, 1.000000, -1.000000, 
0.000000, 0.000000, 1.000000, -1.000000, 
0.000000, 0.000000, 1.000000, -1.000000, 
0.000000, 0.000000, -1.000000, -1.000000, 
0.000000, 0.000000, -1.000000, -1.000000, 
0.000000, 0.000000, -1.000000, -1.000000, 
0.000000, 0.000000, -1.000000, -1.000000, 
0.000000, 0.000000, -1.000000, -1.000000, 
0.000000, 0.000000, -1.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, 0.000000, -1.000000, 
1.000000, 0.000000, -0.000000, -1.000000, 
1.000000, 0.000000, -0.000000, -1.000000, 
1.000000, 0.000000, -0.000000, -1.000000 

}

------------------------------------------------------------------------------------------------------------------
VecContainer<GLuint> indices = 

size: 12
space: 12
{
3, 4, 5, 
6, 7, 8, 
9, 10, 11, 
12, 13, 14, 
15, 16, 17, 
18, 19, 20, 
21, 22, 23, 
24, 25, 26, 
27, 28, 29, 
30, 31, 32, 
33, 34, 35, 
0, 1, 2 

}

什么可能导致这个问题?


正如您之前的问题一样,我认为您仍然遇到同样的问题。您在某处忘记了减号,或者可能以错误的顺序执行了叉积。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GLSL、Opengl 中的视差贴图问题 的相关文章

  • WebClient.DownloadDataAsync 冻结了我的 UI

    我在 Form 构造函数中的 InitializeComponent 之后有以下代码 using WebClient client new WebClient client DownloadDataCompleted new Downloa
  • 无法将 std::min 传递给函数,std::min 的副本有效

    Passing std min函数无法编译 我复制了 libcpp 声明std min进入我的源文件并且它可以工作 std 版本有什么问题 clang 和 gcc 也会发生同样的情况 在 Godbolt 上测试 https godbolt
  • 异常堆栈跟踪不显示抛出异常的位置

    通常 当我抛出异常 捕获它并打印出堆栈跟踪时 我会看到抛出异常的调用 导致该异常的调用 导致该异常的调用that 依此类推回到整个程序的根 现在它只向我显示异常所在的调用caught 而不是它所在的地方thrown 我不明白是什么改变导致了
  • 如果 JSON.NET 中的值为 null 或空格,则防止序列化

    我有一个对象需要以这样的方式序列化 即 null 和 空白 空或只是空格 值都不会序列化 我不控制对象本身 因此无法设置属性 但我知道所有属性都是字符串 环境NullValueHandling显然 忽略 只能让我找到解决方案的一部分 它 似
  • 在 ASP.NET MVC 中将模型从视图传递到控制器

    我正在 ASP NET MVC 中开发我的第一个应用程序 但遇到了一个我无法解决的问题 即使在阅读了整个互联网之后也是如此 因此 我有几个使用视图模型创建的视图 它们是报告 这些视图模型是根据用户选择标准填充的 我正在尝试构建一种接受模型并
  • C 中“complex”的默认类型

    根据我读过的文档 C99 和更高版本的支持float complex double complex and long double complex作为复杂类型 但是 此代码在使用时编译时不会发出警告gcc Wall Wextra inclu
  • 全局使用和 .NET Standard 2.0

    我最近意识到我可以使用 C 10 功能文件范围的命名空间在 NET Standard 2 0 项目中也可以通过设置
  • 将日期时间转换为指定格式

    我有这个日期格式yy MM dd HH mm ss ex 12 02 21 10 56 09 问题是 当我尝试使用以下代码将其转换为不同格式时 CDate 12 02 21 10 56 09 ToString MMM dd yyyy HH
  • 有什么方法可以重载 C# 中的扩展方法吗?

    我有以下模型模式 public abstract class PARENTCLASS public class CHILD A CLASS PARENTCLASS public static class EXTENSION public s
  • 子目录中的头文件(例如 gtk/gtk.h 与 gtk-2.0/gtk/gtk.h)

    我正在尝试使用 GTK 构建一个 hello world 其中包括以下行 include
  • 如何使用递归查找数字中的最小元素 [C]

    好的 所以我正在准备我的 C 考试 当谈到递归时我有点卡住了我是大学一年级的学生 这对我来说似乎有点困难 练习要求在给定的数字中使用递归函数我需要找到最小的元素 例如 52873 是 2 程序需要打印 2 include
  • 时间:2019-03-17 标签:c++fstream并发访问

    如果从不同的进程 线程同时访问文件会发生什么 据我所知 没有锁定文件的标准方法 只有操作系统特定的功能 就我而言 文件将被经常读取而很少写入 现在如果A打开一个文件进行读取 ifstream 并开始读取块 和B打开相同的文件进行写入 ofs
  • 致命错误 gl.h 包含在 glew.h 之前

    include
  • 使用 OleDbCommandBuilder 时访问 SQL 语法错误

    我要在 C 中使用 OleDbDataAdapter 在 Access 数据库中插入数据 但收到错误消息INSERT INTO 命令中的语法错误 BackgroundWorker worker new BackgroundWorker Ol
  • 使用多线程进行矩阵乘法?

    我应该使用线程将两个矩阵相乘 有两件事 当我运行程序时 我不断得到 0 我还收到消息错误 对于每个错误 它在粗体行上显示 警告 从不兼容的指针类型传递 printMatrix 的参数1 我尝试打印输出 还要注意 第一个粗体块 这是我解决问题
  • Linq.Select() 中的嵌套表达式方法调用

    I use Select i gt new T 每次手动点击数据库后将我的实体对象转换为 DTO 对象 以下是一些示例实体和 DTOS 用户实体 public partial class User public int Id get set
  • Xamarin.Forms UWP 项目中标题栏和选项卡之间令人恼火的空白

    我几乎是新手Xamarin Forms我正在开发一个相当简单的跨平台应用程序 该应用程序在 Android 中显示得足够好 但在 UWP 中却出现了一个愚蠢的空白 该项目由一个 TabbedPage 组成 其中包含 4 个 Navigati
  • 如何将 int 作为“void *”传递给线程启动函数?

    我最初有一个用于斐波那契变量数组的全局变量 但发现这是不允许的 我需要进行基本的多线程处理并处理竞争条件 但我无法在 pthread 创建中将 int 作为 void 参数提供 我尝试过使用常量指针 但没有成功 由于某些奇怪的原因 void
  • 如何在c linux中收听特定接口上的广播?

    我目前可以通过执行以下操作来收听我编写的简单广播服务器 仅广播 hello int fd socket PF INET SOCK DGRAM 0 struct sockaddr in addr memset addr 0 sizeof ad
  • C++ Boost ASIO 简单的周期性定时器?

    我想要一个非常简单的周期性计时器每 50 毫秒调用我的代码 我可以创建一个始终休眠 50 毫秒的线程 但这很痛苦 我可以开始研究用于制作计时器的 Linux API 但它不可移植 I d like使用升压 我只是不确定这是否可能 boost

随机推荐