c++ - GLSL/C++ 中的白色(可能未着色)OBJ

标签 c++ opengl glsl meshlab

您好,我正在努力创建一个内部有飞船的空间环境。但是在创建天空盒(没有错误)之后,我将我的飞船放入其中,但它没有颜色。有点像白黑 Here is the project

我用 OPENSCAD 做了(建模)这艘船,然后用 MESHLAB 将它导出为 .OBJ 格式。我将它加载到源代码中,但他没有纹理/颜色。我在 Meshlab 中的飞船:Ship Meshlab

我只需要知道我必须在代码中添加一些关于颜色的东西,否则输入错误。这是什么?

如果您需要我发布代码,但如果一切正常这个错误解释我,无论如何我是 opengl 的小新手,所以请耐心等待,谢谢

编辑:

在 Windows 中查看我的 .obj 文件: SHip meshlab

和 ubuntu 中的相同项目: ship meshlab ubuntu

这有什么区别?

无论如何 openscad 代码:

module navicella(){
  $fn=100;  
    rotate([0,180,270]){
    union(){
         rotate([270,180,0]){   
              rotate([90,0,0])
                cylinder(50,7,10,center=true);

              intersection(){
               translate([0,-25,0])    
                sphere(10);  
               translate([0,-25,0])
                cube(19,center=true);    
              } 
              difference(){
               translate([0,35,0])
                cube([10,15,15],center=true);    
               translate([0,40,0])    
                sphere(13);
              }  

              translate([5,-10,0])rotate([90,0,70])  
                cube([35,1,15],center=true);
              translate([-2,0,0])rotate([90,0,95])  
                cube([50,1,10],center=true);

              translate([0,3,6])rotate([0,-15,90])  
                cube([40,1,20],center=true); 
              translate([0,3,-6])rotate([0,15,90])  
                cube([40,1,20],center=true); 

              translate([0,-35,0])rotate([90,0,0])
                cylinder(10,5,0,center=true);
              translate([0,20,0])rotate([0,90,0])  
                cube([45,1,2],center=true);
              translate([0,25,0]) rotate([90,0,0])
                cylinder(5,4,7,center=true); 
        }    
    }
}
}
navicella();

最佳答案

看起来您忘记禁用所有未被您的模型使用的纹理。这是一个非常常见的错误(我今天仍然一直这样做)。

可能发生了什么?

  1. 您渲染了天空盒或任何带有纹理的对象

    因此,例如 GL_CUBE_MAP 和/或 GL_TEXTURE_2D 已启用。现在,当您开始渲染不包含纹理的网格时,纹理仍处于启用状态。因此,对于每个片段/像素,GL 将始终从所有启用的纹理目标中的最后一个绑定(bind)纹理采样最后设置的纹理坐标,并根据 GL 设置组合颜色。

    因此,如果您的模型不包含纹理坐标,GL 将使用最后设置的坐标。这通常是在黑色边框所在的角落区域......或者你只是在一些黑暗的纹理区域。此外,如果您取消绑定(bind)纹理,这仅意味着您绑定(bind)了通常为黑色的默认纹理 0

    要测试/修复此问题,只需为所有以前使用的纹理目标调用glDisable(GL_....);。如果它可以帮助您了解问题出在哪里。

    此外,如果您的对象包含纹理坐标并且纹理未正确加载(如错误的文件名/路径),则结果通常为黑色。

  2. 在启用照明的情况下渲染时缺少或负法线

    看起来不像,但也可能是原因。如果您的模型有错误或没有 normals,则照明计算会导致错误的照明。如果对象始终是黑暗的,即使您旋转它,法线也会被取消(面向另一方向),您应该更改正面的照明/ Material 或取消法线。

    如果颜色强度随着旋转而变化,那么您的对象可能没有法线,并且再次使用最后设置的法线(来自之前的渲染)。在这种情况下,要么计算对象的法线(通过叉积),要么禁用该对象的光照。

关于c++ - GLSL/C++ 中的白色(可能未着色)OBJ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37634394/

相关文章:

arrays - WebGL:将统一数组传递给着色器

C++ 数组初始化

C++ 读/写大文件

c++ - 在 OpenGL 中快速绘制许多相同的对象

c++ - OpenGL 应用程序在其他计算机上崩溃

OpenGL/GLSL 比 imageStore() 更快的方法来设置纹理的多个像素?

c++ - 在不排序的情况下搜索数组中的重复项的最快方法是什么?

c++ - 在线裁判的输出不同

c - OpenGL - 圆圈绘制不平滑

opengl - GLSL 大气散射不随变换缩放