绘制顺序是否会影响对象的深度位置? (包括图片)

2023-12-26

我的场景中有一些对象,即使我指定对象 A 的 y= 10(最高的对象),从顶部摄像机我也可以通过对象 A 看到底部对象。这是我场景中的图像。

直到今天我才发现一个有趣的属性,模型的绘制顺序很重要,我可能是错的。这是另一张图像,我更改了“ship1”的绘制顺序,注意:“ship1”远远低于我的场景,如果我这样做的话ship1.draw();首先,船消失了(正确),但如果我这样做ship1.draw();最后,他出现在顶部(不正确)。

Video:

  • Q1) 抽签顺序总是很重要吗?
  • Q2)如何解决这个问题,每次更改相机位置时都应该更改绘制顺序吗?

Edit:我还将我的透视投影类与 glm 库进行了比较,只是为了确保这不是我的投影矩阵的问题。一切都是正确的。

Edit1:我在 git 上有我的项目:打砖块 git 存储库 https://github.com/RareFever/Arkanoid.git(Windows,项目可以在任何安装了VS的计算机上运行)

Edit2:我不使用法线或纹理。只是顶点和索引。

Edit3:如果场景中的每个对象都使用(共享)同一文件中的顶点,是否有问题?

Edit4:我还更改了透视投影值。我的近平面为 0.0f,现在近=20.0f,远=500.0f,角度=60°。但什么都没有改变,视野改变了,但深度没有改变。 =/

Edit5:这是我的顶点和片段着色器。

Edit6:随时联系我,我整天都在这里,有什么问题都可以问我。目前我正在从零重写所有项目。我有两个渲染良好的立方体,一个在另一个前面。已经添加了我的类:相机、投影、着色器处理程序。转到创建和绘制对象的类。

// Vertex shader

in   vec4 in_Position;
    out vec4 color;
    uniform mat4 Model;
    uniform mat4 View;
    uniform mat4 Projection;

    void main(void)
    {
        color = in_Position;
        gl_Position =   Projection * View    * Model * in_Position;
    }

// Fragment shader

       #version 330 core
    in   vec4 color;
    out vec4 out_Color;
    void main(void)
    {
        out_Color = color;
    }

一些代码:

 void setupOpenGL() {
    std::cerr << "CONTEXT: OpenGL v" << glGetString(GL_VERSION) << std::endl;
    glClearColor(0.1f, 0.1f, 0.1f, 1.0f);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glDepthMask(GL_TRUE);
    glDepthRange(0.0, 1.0);
    glClearDepth(1.0);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);
    glFrontFace(GL_CCW);
}

    void display()
{
    ++FrameCount;
    glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    renderScene();
    glutSwapBuffers();
}
void renderScene()
{
    wallNorth.draw(shader);
    obstacle1.draw(shader);
    wallEast.draw(shader);
    wallWest.draw(shader);
    ship1.draw(shader);
    plane.draw(shader);
}

我已经克隆了您链接的存储库,以查看问题是否位于其他地方。在最新版本中,Object3D::draw 函数如下所示:

    glBindVertexArray(this->vaoID);

    glUseProgram(shader.getProgramID());
    glUniformMatrix4fv(this->currentshader.getUniformID_Model(), 1, GL_TRUE, this->currentMatrix.getMatrix());  // PPmat é matriz identidade
    glDrawElements(GL_TRIANGLES, 40, GL_UNSIGNED_INT, (GLvoid*)0);
    glBindVertexArray(0);
    glUseProgram(0);

    glClear( GL_DEPTH_BUFFER_BIT); <<< clears the current depth buffer.

最后一行在绘制每个对象后清除深度缓冲区,这意味着绘制的下一个对象未​​正确遮挡。您应该每帧只清除一次深度缓冲区。

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

绘制顺序是否会影响对象的深度位置? (包括图片) 的相关文章

  • OpenGL纹理渲染与原始不匹配

    我正在尝试使用 OpenGL 渲染纹理 我用作测试的纹理是白色背景上的一堆黑色矩形 如下所示 然而 在渲染时 纹理似乎被复制并叠加在其自身之上多次 我使用以下方法设置场景 std string vertexSource ShaderLoad
  • C# AES Rijndael - 检测无效密码

    我正在使用 Rijndael 加密程序中的一些敏感数据 当用户输入错误的密码时 大多数情况下CryptographicException抛出消息 填充无效且无法删除 然而 CryptStream 不会抛出密码错误的异常 而是返回错误解密的流
  • 简单的 C++ 线程

    我正在尝试在 C Win32 中创建一个线程来运行一个简单的方法 我是 C 线程的新手 但对 C 中的线程非常熟悉 这是我想做的一些伪代码 static void MyMethod int data RunStuff data void R
  • C 中的分段错误

    我需要用 0 填充二维数组 但编译后的程序会出现此错误 怎么了 int main int vert 1001 1001 int hor 1001 1001 int dudiag 1416 1416 int uddiag 1416 1416
  • ZedGraph 缩放和调整大小

    当我绘制图形 放大和缩小并重新绘制图形时 图形的位置不会改变 我想要做的是 每当重新绘制数据时 视图都会更改以查看所有图形数据 如果您在重绘之前放大或缩小 这似乎会被禁用 Thanks 设置属性 IsZoomOnMouseCenter对于控
  • 无法在更新面板中找到上传的文件

    aspx
  • 如何在片段着色器中将 gl_FragCoord 转换为世界空间点?

    我的理解是 如果您有视图投影矩阵 屏幕宽度和屏幕高度的逆矩阵 则可以将 gl FragCoord 转换为片段着色器中世界坐标中的点 首先 你转换gl FragCoord x and gl FragCoord y通过分别除以宽度和高度 然后将
  • NUnit 测试运行顺序

    默认情况下 nunit 测试按字母顺序运行 有谁知道有什么方法可以设置执行顺序吗 是否存在这样的属性 我只是想指出 虽然大多数受访者认为这些是单元测试 但问题并没有具体说明它们是 nUnit 是一个很棒的工具 可用于各种测试情况 我可以看到
  • 错误 C2064:术语不计算为采用 1 个参数的函数

    class Student bool Graduate return m bGraduate class School vector
  • 没有真正理解 std::atomic::compare_exchange_weak 和compare_exchange_strong 的逻辑

    我读了https en cppreference com w cpp atomic atomic compare exchange https en cppreference com w cpp atomic atomic compare
  • 如何忽略搜索条件中的空属性

    我有一个不好的要求要做 无论如何 我必须在我的应用程序中实现它 我有一个Track class public class Track public string Name get set public string City get set
  • 表单.位置不起作用

    我之前问过这个问题 以为我已经解决了 但它仍然不起作用 Form Show 稍微移动表单位置 https stackoverflow com questions 1214014 form show moves form position s
  • 一些涉及类析构函数和删除运算符的内存管理问题?

    在阅读了一些教程后 我仍然不清楚 C 中内存管理的一些观点 1 当使用 new 运算符声明的类超出范围时 是否会调用其析构函数并释放内存 是否有必要调用删除运算符来释放类的内存并调用其析构函数 class Test void newTest
  • 如何最好地为 Visual Studio 2017 构建的 CMake C++ 项目设置输出目录?

    我使用 Visual Studio 2017 使用 vcxproj 文件构建 C 桌面项目 我喜欢默认行为 其中输出目录是项目下面的子目录 例如 myproj sln myproj vcxproj x64 myproj release my
  • 在发送传出请求之前将新的 SoapClient 绑定到特定 IP 地址

    假设应用程序所在的计算机具有 SoapClient 具体来说 我正在使用 Microsoft Web Service3 Messaging SoapClient 它通过发送传出请求并获取 SoapEnvelope 作为回报 完善的流程 与远
  • RabbitMQ + Windows + LDAP 无需发送密码

    我正在尝试在 Windows 7 上使用 RabbitMQ 3 6 2 进行 LDAP 身份验证 授权 我已经在应用程序发送用户名 密码的情况下进行了基本身份验证 但密码位于我需要弄清楚如何进行的代码中避免 有没有人在不提供密码的情况下成功
  • Azure Function App Azure 服务总线触发器触发两次

    我使用带有服务总线触发器的 Azure Function Apps 来读取服务总线并对服务总线消息的内容执行操作 服务总线接收 JSON 序列化对象 然后将 JSON 消息反序列化回 Function App 中的对象 然而 由于某种原因
  • 在 C++ 中将大型数据向量写入/读取到二进制文件

    我有一个 C 程序 它通过将 ascii 文件中的网格人口数据读取到大型 8640x3432 元素双精度向量中来计算给定半径内的人口 将 ascii 数据读入向量大约需要 30 秒 循环每列和每行 而程序的其余部分只需要几秒钟 我被要求通过
  • 通过 OCI 调用 Oracle 存储过程并使用 C++ 中的 out ref 游标返回结果

    我想使用 OCI 接口从 C 调用 Oracle 存储过程 并使用 out SYS REF CURSOR 作为过程的参数来迭代结果 我是 OCI 新手 所以可能会遗漏一些简单的东西 大部分代码取自这里 我的存储过程是 CREATE OR R
  • 如何通过Task.ContinueWith创建传递?

    我想在原始任务结束时添加一个任务 但想保留原始结果和类型 附加任务仅用于记录目的 例如写入控制台等 例如 Task Run gt DateTime Now Hour gt 12 Hey throw new Exception Continu

随机推荐

  • CollapsingToolbarLayout:类似于 Facebook 的自定义 contentScrim

    我想为我的产品创建一个自定义 contentScrimcollapsingToolbarLayout 我的 collapsingToolbarLayout 有一个imageview里面 当它滚动时 理论上图像视图应该淡出 而我的稀松布颜色应
  • 显示加载窗口

    我在 WPF 中的应用程序加载外部资源 因此我想在程序加载时显示加载表单 我尝试创建表单 并在加载代码之前显示 并在加载结束时关闭 private void Window Loaded object sender RoutedEventAr
  • 本地Tomcat环境未启动

    我正在尝试运行本地 Tomcat 环境 但始终遇到以下错误 Can t load log handler 2localhost org apache juli FileHandler java lang ClassNotFoundExcep
  • 使用 fread() 将文本文件读入缓冲区 - 为什么缓冲区中的值不是每个字符各自的 ASCII 值?

    首先 这不是家庭作业 只是想了解为什么我会在屏幕上看到这些内容 下面的内容 我自己的工作 当前采用输入文件并将其作为二进制文件读取 我希望它将读取的每个字节存储在数组中 以供以后使用 为了简洁起见 输入文件 Hello txt 仅包含 He
  • ALV 列表中的两级列标题

    我想添加一个标题行来对列标题进行分组 Departure Arrival lt This row is what I want to add Airport Gate Date Airport Gate Date O Hare A10 10
  • 手机端口0接收短信

    我正在将 J2ME 应用程序配置为在收到 SMS 时从推送注册表获取事件 在 SMS 消息到达收件箱之前 我能否访问该消息 我读到发送到移动设备 port0 的消息会直接发送到本机收件箱 我们无法访问它 是否有任何方法可以转移甚至嗅探这些消
  • 单个应用程序窗口的任务管理器中 Visual Studio Code 的多个实例或进程

    我正在使用 Visual Studio 代码 我的机器面临性能问题 我去了任务管理器 看到有几个实例Code exe在进程选项卡中 即使有only我的电脑上正在运行 活动的 Visual Studio Code 的一个窗口 我可以看到总共有
  • 以编程方式编写 gui,还是使用高级 gui 编辑器(Java Swing)?

    我计划编写一个基于 Swing 的应用程序 使用 Netbeans 6 8 看来 Netbeans 有一个非常先进的 GUI 编辑器 我仍然对它生成的代码存有疑问 另外 我不喜欢代码部分被锁定的事实 我仍然理解这种需要 有人成功使用 Net
  • DbConnectionStringBuilder 在 PowerShell 中使用时不会解析

    我正在尝试使用以下功能DbConnectionStringBuilder用于解析类似连接字符串的用户输入 这在 C 中工作得很好 using System using System Data Common class Program sta
  • postgresql - 查询构建 json

    运行 PostgreSQL 9 6 2 我的数据以键 值对的形式存储在表中 key 实际上是一个json对象的路径 每一个都是一个属性 例如 如果键是 cogs props1 value 那么 json 对象将如下所示 cogs props
  • Python-将脚本安装到系统

    如何为我自己的脚本制作 setup py 文件 我必须使我的脚本全球化 将其添加到 usr bin 这样我就可以从控制台运行它 只需键入 scriptName 参数 操作系统 Linux EDIT 现在我的脚本可以安装了 但是如何使其全局化
  • JavaScript 立即函数

    Stoyan Stefanov 在 Javascript Patterns 中说道 你需要一个即时函数来将所有代码包装在其本地作用域中 并且不会将任何变量泄漏到全局作用域 第 70 页 这是他的例子 function var days Su
  • Angular 9 中的视频 JS - 实时视频 - “无法解决 videojs”问题?

    我正在努力让 videojs 在我的 Angular 9 应用程序中工作 我已经查看了所有现有的 stackoverflow 帖子 应用了他们的解决方案 查看了不同的博客文章和 github 来了解视频 js 的问题 但我仍然遇到 无法解决
  • 清除 mySql 中的电话号码字段

    不是数据库人员 而是 我混淆了我继承的 mySql 数据库中的数据 部分电话号码已格式化 512 555 1212 称之为肮脏 其他的5125551212 称之为干净 我需要一个 sqlstamet 说 UPDATE table name
  • UINavigationBar 不与 swift 4 中的 UICollectionView 重叠

    我将导航栏放在 swift 4 中的 UICollectionView 中 当我滚动 collectionView 时 它不会转到后层 而是与导航栏重叠 self collectionview contentInset UIEdgeInse
  • 常见 Linq 表达式的示例 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 当我编写代码时 我开始确定可以使用 Linq 的地方 我的问题是我对语法还很陌生 我通过示例学习效果最好 但我似乎无法轻松找到我需要的
  • 如何禁用 Surface 4 Pro 中的 WPF 平板电脑支持?

    我继承了一个面向 Net 3 5 的 WPF 应用程序 并且必须将其安装在 Surface Pro 4 I5 中 应用程序挂在不同的点 我观察到动画有时永远不会触发已完成的事件 也许它们在某个点结束 但不是在 Duration 属性中表示的
  • 是否有最佳方法来部署架构以使用微服务模型发送短信?

    我们在后端类中有一个服务 该服务如下所示 Setup AWS SNS AWS config update region eu west 1 accessKeyId process env AWS ACCESS KEY ID secretAc
  • div的一部分透明?

    是否可以仅使 div 的一部分透明 就像 div 中的一定空间一样 例如 您从 div 顶部选择 100px 并且顶部 100px 设置了不透明度 我该怎么做呢 您可以做几件事 尝试使用一半透明而另一半不透明的背景图像 使用 CSS 渐变时
  • 绘制顺序是否会影响对象的深度位置? (包括图片)

    我的场景中有一些对象 即使我指定对象 A 的 y 10 最高的对象 从顶部摄像机我也可以通过对象 A 看到底部对象 这是我场景中的图像 直到今天我才发现一个有趣的属性 模型的绘制顺序很重要 我可能是错的 这是另一张图像 我更改了 ship1