gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:49:12 26 4
gpt4 key购买 nike

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

Front view

我想使用法线作为颜色,这样我就可以看到脸部的特定细节等。我将法线绑定(bind)到顶点位置 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 绑定(bind)到 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 );

}

片段着色器.shader

#version 330

in vec3 normals;

out vec4 fragment_color;

void main()
{

fragment_color = vec4( normals, 1.0 );

}

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

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

最佳答案

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

enter image description here

关于c++ - 使用 assimp 在 OpenGL 中使用法线作为颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24252987/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com