0

嗨,我正在努力创建一个内部有船的空间环境。但是在创建天空盒(没有错误)之后,我把我的船放在里面,但它没有颜色。有点像白黑 这里是项目

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

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

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

编辑 :

.obj在 Windows 中 查看我的文件:船舶网格实验室

和 ubuntu 中的同一个项目: 船舶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();
4

1 回答 1

4

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

可能发生了什么?

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

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

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

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

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

  2. normals在启用照明的情况下进行渲染时丢失或出现负数

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

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

于 2016-06-05T08:08:47.980 回答