【问题标题】:Use normals as colors in OpenGL using assimp使用 assimp 在 OpenGL 中使用法线作为颜色
【发布时间】:2014-08-06 19:50:42
【问题描述】:

我将 suzanne 模型从 blender(Monkey head) 导出为 .obj 文件,只有在片段着色器中使用 RGB 值时才能看到它。例如frag_color = vec4( 1.0, 0.0, 0.0, 1.0 ); 使模型变为红色。但是除非我旋转它,否则它看起来就像一个变形的纹理

我想使用法线作为颜色,以便我可以看到面部的特定细节等。我将法线绑定到顶点位置 1。

    if ( mesh -> HasNormals() )
    {

        normals = ( GLfloat * ) malloc( * pointCount * 3 * sizeof( GLfloat ) );

        for ( int i = 0; i < * pointCount; i++ )
        {

            const aiVector3D * vn = &( mesh -> mNormals[ i ] );

            normals[ i * 3 ] = ( GLfloat ) vn -> x;
            normals[ i * 3 + 1 ] = ( GLfloat ) vn -> y;
            normals[ i * 3 + 2 ] = ( GLfloat ) vn -> z;

        }

        GLuint vbo;

        glGenBuffers( 1, &vbo );
        glBindBuffer( GL_ARRAY_BUFFER, vbo );
        glBufferData( GL_ARRAY_BUFFER, 3 * * pointCount * sizeof( GLfloat ), normals, GL_STATIC_DRAW );
        glVertexAttribPointer( 1, 3, GL_FLOAT, GL_FALSE, 0, NULL );
        glEnableVertexAttribArray( 1 );

        free( normals );

    }

我在附加着色器之后但在链接之前将1 绑定到vertex_normal

glAttachShader( program, vertShader );
glAttachShader( program, fragShader );

glBindAttribLocation( program, 0, "vertex_position" );
glBindAttribLocation( program, 1, "vertex_normal" );

glLinkProgram( program );

这些是我的着色器

vertshader.shader

#version 330

in vec3 vertex_position;
in vec3 vertex_normal;

uniform mat4 proj, view, model;

out vec3 normals;

void main()
{

    normals = vertex_normal;

    gl_Position = proj * vec4( vec3( view * model * vec4( vertex_position, 1.0 ) ), 1.0 );

}

fragshader.shader

#version 330

in vec3 normals;

out vec4 fragment_color;

void main()
{       

    fragment_color = vec4( normals, 1.0 );

}

但这只会输出黑屏。我知道模型正在加载,因为我可以像上面那样将它涂成红色。我尝试将vertex_normal 直接导入frag 着色器,但没有成功,我还尝试规范化normals,但这也没有改变效果。

那么如何在片段着色器中使用模型法线作为颜色?

【问题讨论】:

  • 您所做的事情乍看起来很合理。检查(希望)显而易见:您验证模型实际上具有法线? if (mesh-&gt;HasNormals()) 中的代码已执行,如果您在调试器中单步执行或记录值,您会看到看起来合理的向量吗?
  • 另外,缩小问题范围的一种方法是将背景颜色设置为黑色以外的颜色。这将告诉您模型是否呈现黑色。
  • 嗯,我没有考虑它没有法线的可能性,因为我能够翻转它们并将它们导出到搅拌机中。我尝试使用具有翻转法线和未翻转法线的模型。我还没有尝试改变背景,我会在渲染后告诉你结果
  • 所以我将背景更改为红色,我看到模型被渲染为黑色。这是否意味着它没有法线或者由于语法错误等原因没有绘制法线?

标签: c++ opengl shader normals assimp


【解决方案1】:

好的,我找到了解决办法。显然这是搅拌机的错。我想用我的网格导出的内容有一个侧面板,Write normals 没有被选中。感谢 Reto Koradi,我认为没有法线就无法编写网格。

【讨论】:

    猜你喜欢
    • 2014-06-07
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多