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

White (maybe uncolored) OBJ in GLSL/C++

您好,我正在努力创建一个 space 环境,其中有一艘船 inside.But 在创建天空盒后(没有错误)我把我的船放在里面但它没有颜色。有点像白黑

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

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

如果你需要我post代码,但如果东西正常这个错误解释我,反正我是opengl的小新手,所以耐心等待, 谢谢

编辑:

在 windows 中查看我的 .obj 文件:

和 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 已启用。现在,当您开始渲染不包含纹理的网格时,纹理仍处于启用状态。因此,对于每个 fragment/pixel GL 将始终从所有启用的纹理目标中的最后一个绑定纹理采样最后设置的纹理坐标,并根据 GL[ 组合颜色=45=]设置。

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

    到test/remedy这只是调用glDisable(GL_....);所有以前使用的纹理目标。如果它能帮助你知道问题出在哪里。

    此外,如果您的对象包含纹理坐标并且未正确加载纹理(例如错误的文件name/path),那么结果通常是黑色的。

  2. 在启用照明的情况下渲染时缺失或负值normals

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

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