C++ 使用着色器绘制3D对象的正确方法是什么?

C++ 使用着色器绘制3D对象的正确方法是什么?,c++,opengl,glsl,shader,C++,Opengl,Glsl,Shader,我有一个从3DS Max导出的OBJ&MTL文件,它是一个完整的国际象棋集。在我的最终结果中,我希望能够选择一个游戏块&然后选择一个正方形来移动它。我遇到的问题包括: 对象选择 着色器 我让我的对象导入器以两种方式工作 1将所有内容和类似材质组合到一个名为“网格”的结构中,并循环绘制每个帧的所有model.Mesh 2识别棋盘、每个方块和每个游戏棋子,并将相关顶点、材质等放入名为GroupObject的结构中。它们被放置在model.objects中,我在每个帧中循环绘制 下面是1和2中描述的每

我有一个从3DS Max导出的OBJ&MTL文件,它是一个完整的国际象棋集。在我的最终结果中,我希望能够选择一个游戏块&然后选择一个正方形来移动它。我遇到的问题包括:

对象选择 着色器 我让我的对象导入器以两种方式工作

1将所有内容和类似材质组合到一个名为“网格”的结构中,并循环绘制每个帧的所有model.Mesh

2识别棋盘、每个方块和每个游戏棋子,并将相关顶点、材质等放入名为GroupObject的结构中。它们被放置在model.objects中,我在每个帧中循环绘制

下面是1和2中描述的每个选项的屏幕截图。在SS的顶部1/2,我只是画出网格,所有的着色看起来都是正确的,但是没有任何东西是可选的。在底部的1/2中,我可以选择一个游戏块或一个正方形,但模型看起来像垃圾

此外,如果将着色器与2中的代码一起使用,平移和缩放速度会减慢为爬行。它几乎完全没有反应

下面是调用的方法,用于每帧绘制对象。前两条注释线是我尝试选项1的地方,只需绘制我的结构网格,它看起来不错。旋转和缩放也很平滑,但我无法选择对象b/c我无法选择网格的名称。现在,代码正在每个model.objects中循环设置,这样我就可以运行glPushName到object;这是拾取/选择游戏棋子或方块所必需的。注释掉的部分是我尝试应用着色器的地方,该着色器在通过model.objects循环时非常慢。在循环model.mesh

如何将所有这些函数合并在一起?我的第一个想法是绘制所有不包含任何材质信息的model.objects,并使其透明。然后运行第二个循环,并使用着色器绘制所有model.meshes和material。但后来我想,当我开始将游戏棋子移动到一个新的方块上时,我将如何确保将正确的阴影应用到棋子的新位置。当我选择透明的GroupObject并将其转换为新的正方形时,该块是否仍具有适当的着色


解决我遇到的问题的最佳方法是什么?

为什么在GLEngine::drawFace中将法线作为纹理坐标发送:

您希望它是glNormal3d,如您在此处所见:

normal = normalize(gl_NormalMatrix * gl_Normal);

为什么在GLEngine::drawFace中将法线作为纹理坐标发送:

您希望它是glNormal3d,如您在此处所见:

normal = normalize(gl_NormalMatrix * gl_Normal);

嗯,这似乎是个错误。今晚我将改变这一点,看看会发生什么。另外,你认为这与为什么在使用drawFace着色器时一切都会变慢为爬行有关吗?我相信当我从3ds max导出时,我强制它们为三角形,因此我将在face.size循环外尝试glBegin&glEnd。我今晚回来报到。非常感谢您的回复!我的棋子看起来好多了!棋盘上的方块都是白色的,但我想这是照明问题。性能更好,但仍然起伏不定。我可以尝试使用模具缓冲区来拾取和绘制具有相似材质的所有顶点,以提高性能。嗯,这似乎是个错误。今晚我将改变这一点,看看会发生什么。另外,你认为这与为什么在使用drawFace着色器时一切都会变慢为爬行有关吗?我相信当我从3ds max导出时,我强制它们为三角形,因此我将在face.size循环外尝试glBegin&glEnd。我今晚回来报到。非常感谢您的回复!我的棋子看起来好多了!棋盘上的方块都是白色的,但我想这是照明问题。性能更好,但仍然起伏不定。我可以尝试使用模具缓冲区来拾取和绘制具有相似材质的所有顶点,以提高性能。
Per-fragment Blinn-Phong shader for a single directional light source.

[vert]


varying vec3 normal;

void main()
{
    normal = normalize(gl_NormalMatrix * gl_Normal);

    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    gl_TexCoord[0] = gl_MultiTexCoord0;    
}

[frag]


uniform sampler2D colorMap;
uniform float materialAlpha;

varying vec3 normal;

void main()
{   
    vec3 n = normalize(normal);

    float nDotL = max(0.0, dot(n, gl_LightSource[0].position.xyz));
    float nDotH = max(0.0, dot(normal, vec3(gl_LightSource[0].halfVector)));
    float power = (nDotL == 0.0) ? 0.0 : pow(nDotH, gl_FrontMaterial.shininess);

    vec4 ambient = gl_FrontLightProduct[0].ambient;
    vec4 diffuse = gl_FrontLightProduct[0].diffuse * nDotL;
    vec4 specular = gl_FrontLightProduct[0].specular * power;
    vec4 color = gl_FrontLightModelProduct.sceneColor + ambient + diffuse + specular;

    gl_FragColor = color * texture2D(colorMap, gl_TexCoord[0].st);
    gl_FragColor.a = materialAlpha;
}
glTexCoord3d(face.normals[v]->x, face.normals[v]->y, face.normals[v]->z);
normal = normalize(gl_NormalMatrix * gl_Normal);