使用assimp在OpenGL中使用法线作为颜色

时间:2014-06-16 22:07:27

标签: c++ opengl shader normals assimp

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

Front view

我想使用法线作为颜色,以便我可以在面部看到特定的细节等。我将法线绑定到顶点位置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直接导入到碎片着色器中,但是我也尝试将normals规范化并且也没有改变效果。

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

1 个答案:

答案 0 :(得分:0)

好的,我找到了解决办法。显然这是搅拌机故障。我想用网格导出的内容有一个侧面板,并且未检查Write normals。感谢Reto Koradi,我认为没有法线可以编写网格。

enter image description here