在OpenGL中将纹理映射到顶点
Mapping a texture to vertices in OpenGL
我正在尝试使用OpenGL渲染纹理网格。目前,我的主要班级拥有一个由以下组成的状态:
std::vector<vec3d> vertices
std::vector<face> mesh
std::vector<vec3d> colors
vec3d
是3D向量的实现——没有什么特别的——而face
是一个包含3个整数的类,指向vertices
中垂直线的索引。
到目前为止,我用以下代码渲染了没有纹理的网格(工作正常):
glShadeModel(params.smooth ? GL_SMOOTH : GL_FLAT);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
/*This is my attempt to add the texture
*
*if (_colors.size() != 0) {
* cout << "Hello" << endl;
* glClientActiveTexture(GL_TEXTURE0);
* glEnableClientState(GL_TEXTURE_COORD_ARRAY);
* glTexCoordPointer(3,GL_FLOAT,0,&_colors[0].x);
}*/
glNormalPointer(GL_FLOAT,0,&normals[0].x);
glVertexPointer(3,GL_FLOAT,0,&vertices[0].x);
glDrawElements(GL_TRIANGLES,mesh.size()*3,GL_UNSIGNED_INT,&mesh[0].v1);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
我的纹理存储在colors
中,作为0和1之间浮动的三元组列表。但是,不会应用颜色。我读了很多纹理贴图的例子,并试图做同样的事情,但没有成功。你知道我做错了什么吗?
从您的评论中可以看出,您使用了错误的OpenGL功能来实现您想要的功能。纹理是指通过使用例如uv坐标将2d图像粘贴到网格上。
您要做的是在每个顶点上指定一种颜色,因此需要启用GL_color_ARAY而不是GL_TEXTURE_CORD_ARAY,并为此使用相应的函数。
一个额外的提示:如果你从零开始学习OpenGL,你应该考虑只使用现代的OpenGL(3.2+)
回答最后一条评论:
嗯,我从纹理文件中读取了这些颜色,这就是我的意思。有没有一种方法可以使用这样的数组以彩色显示我的网格?
是和否:当你这样做的时候,你很可能不会得到你期望的结果。通常,纹理中会有多个像素,这些像素应该映射到一个面上。对于顶点颜色,每个顶点只能应用一个颜色值,该值将在三角形上插值。看看如何将纹理应用于网格,你应该能够在互联网上找到很多资源。
相关文章:
- OpenGL 透视投影裁剪多边形与顶点在视锥体之外 = 错误的纹理映射?
- 尝试将纹理映射到 GLSL 中的三角形时出现访问冲突
- GPU驱动程序中的Vulkan纹理映射不准确
- GLSL纹理映射,最大纹理数
- 使用 OpenGL 和 QT 进行纹理映射 - C++
- 使用 openGL 进行多纹理映射
- 如何将纹理映射到 3D 对象
- OpengGl 4.2 纹理映射未显示
- openGL中的Does纹理映射遵循反向方法的正向纹理映射
- QOpenGLWidget纹理映射结果为黑屏
- DX11 将顶点缓冲区映射为 WRL::ComPtr
- 在OpenGL中将纹理映射到顶点
- OpenGL 3.3纹理映射三角形
- GLSL纹理映射不起作用
- 寻找球面纹理映射的和
- Directx9.0纹理映射渲染
- 如何在SFML或OpenGL中正确地将纹理映射到凸多边形上
- DirectX 11直接纹理映射
- glDrawArrays vs glDrawElements w/纹理映射
- Opengl纹理映射