您好,我正在努力创建一个内部有飞船的空间环境。但是在创建天空盒(没有错误)之后,我将我的飞船放入其中,但它没有颜色。有点像白黑
我用 OPENSCAD
做了(建模)这艘船,然后用 MESHLAB
将它导出为 .OBJ
格式。我将它加载到源代码中,但他没有纹理/颜色。我在 Meshlab 中的飞船:
我只需要知道我必须在代码中添加一些关于颜色的东西,否则输入错误。这是什么?
如果您需要我发布代码,但如果一切正常这个错误解释我,无论如何我是 opengl 的小新手,所以请耐心等待,谢谢
编辑:
这有什么区别?
无论如何 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();
最佳答案
看起来您忘记禁用所有未被您的模型使用的纹理。这是一个非常常见的错误(我今天仍然一直这样做)。
可能发生了什么?
您渲染了天空盒或任何带有纹理的对象
因此,例如
GL_CUBE_MAP
和/或GL_TEXTURE_2D
已启用。现在,当您开始渲染不包含纹理的网格时,纹理仍处于启用状态。因此,对于每个片段/像素,GL 将始终从所有启用的纹理目标中的最后一个绑定(bind)纹理采样最后设置的纹理坐标,并根据 GL 设置组合颜色。因此,如果您的模型不包含纹理坐标,GL 将使用最后设置的坐标。这通常是在黑色边框所在的角落区域......或者你只是在一些黑暗的纹理区域。此外,如果您取消绑定(bind)纹理,这仅意味着您绑定(bind)了通常为黑色的默认纹理
0
。要测试/修复此问题,只需为所有以前使用的纹理目标调用
glDisable(GL_....);
。如果它可以帮助您了解问题出在哪里。此外,如果您的对象包含纹理坐标并且纹理未正确加载(如错误的文件名/路径),则结果通常为黑色。
在启用照明的情况下渲染时缺少或负
法线
看起来不像,但也可能是原因。如果您的模型有错误或没有
normals
,则照明计算会导致错误的照明。如果对象始终是黑暗的,即使您旋转它,法线也会被取消(面向另一方向),您应该更改正面的照明/ Material 或取消法线。如果颜色强度随着旋转而变化,那么您的对象可能没有法线,并且再次使用最后设置的法线(来自之前的渲染)。在这种情况下,要么计算对象的法线(通过叉积),要么禁用该对象的光照。
关于c++ - GLSL/C++ 中的白色(可能未着色)OBJ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37634394/