美文网首页
LearnOpenGL 坐标系统(2)

LearnOpenGL 坐标系统(2)

作者: li_礼光 | 来源:发表于2020-09-27 18:37 被阅读0次

解决 : LearnOpenGL 坐标系统(1) 最后留的一个问题:就是前后两面纹理正常,其他四面不正常,怎么修改

这里要思考这里面的多个内容的关系, Shader, 顶点数据(顶点坐标, 纹理坐标) , gl程序 .




纹理坐标

因为前面一直用的是索引的方式 . 其实大体思路是没有任何问题的.
但是需要处理对应的纹理坐标和顶点坐标的关系的时候, 用索引来做, 是有问题的.为什么呢?

//纹理坐标, 纹理坐标用的三角形坐标一致
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (GLvoid*)0);
glEnableVertexAttribArray(2);

注意 : 回顾前面关于纹理的内容, 纹理坐标系跟顶点坐标系不一样. 纹理坐标起始于(0, 0),也就是纹理图片的左下角,终始于(1, 1).



当前问题

问题一 : 如果跟顶点数据一致, 那么-0.5 小于 0 , 所以超出了纹理坐标范围之外. 那么就需要修改Shader程序.
问题二 : 利用索引实现纹理坐标的话, 那有几个面的纹理坐标只有2个点, 不足以构成4个点. 如下图.

image.png

这里还需要注意回顾的是两种Draw方式的区别

glDrawArrays : 传输或指定的数据是最终的真实数据,在绘制时效能更好 
glDrawElements : 指定的是真实数据的调用索引,在内存/显存占用上更节省 

虽然使用索引的方式在性能上更优, 但是无法满足我们需要的效果. 所以还是只能用glDrawArrays.




修改顶点数据, Shader不变.

顶点数据

GLfloat vertices[] = {
   -0.5f, -0.5f, -0.5f,  0.0f, 0.0f,
    0.5f, -0.5f, -0.5f,  1.0f, 0.0f,
    0.5f,  0.5f, -0.5f,  1.0f, 1.0f,
    0.5f,  0.5f, -0.5f,  1.0f, 1.0f,
   -0.5f,  0.5f, -0.5f,  0.0f, 1.0f,
   -0.5f, -0.5f, -0.5f,  0.0f, 0.0f,

   -0.5f, -0.5f,  0.5f,  0.0f, 0.0f,
    0.5f, -0.5f,  0.5f,  1.0f, 0.0f,
    0.5f,  0.5f,  0.5f,  1.0f, 1.0f,
    0.5f,  0.5f,  0.5f,  1.0f, 1.0f,
   -0.5f,  0.5f,  0.5f,  0.0f, 1.0f,
   -0.5f, -0.5f,  0.5f,  0.0f, 0.0f,

   -0.5f,  0.5f,  0.5f,  1.0f, 0.0f,
   -0.5f,  0.5f, -0.5f,  1.0f, 1.0f,
   -0.5f, -0.5f, -0.5f,  0.0f, 1.0f,
   -0.5f, -0.5f, -0.5f,  0.0f, 1.0f,
   -0.5f, -0.5f,  0.5f,  0.0f, 0.0f,
   -0.5f,  0.5f,  0.5f,  1.0f, 0.0f,

    0.5f,  0.5f,  0.5f,  1.0f, 0.0f,
    0.5f,  0.5f, -0.5f,  1.0f, 1.0f,
    0.5f, -0.5f, -0.5f,  0.0f, 1.0f,
    0.5f, -0.5f, -0.5f,  0.0f, 1.0f,
    0.5f, -0.5f,  0.5f,  0.0f, 0.0f,
    0.5f,  0.5f,  0.5f,  1.0f, 0.0f,

   -0.5f, -0.5f, -0.5f,  0.0f, 1.0f,
    0.5f, -0.5f, -0.5f,  1.0f, 1.0f,
    0.5f, -0.5f,  0.5f,  1.0f, 0.0f,
    0.5f, -0.5f,  0.5f,  1.0f, 0.0f,
   -0.5f, -0.5f,  0.5f,  0.0f, 0.0f,
   -0.5f, -0.5f, -0.5f,  0.0f, 1.0f,

   -0.5f,  0.5f, -0.5f,  0.0f, 1.0f,
    0.5f,  0.5f, -0.5f,  1.0f, 1.0f,
    0.5f,  0.5f,  0.5f,  1.0f, 0.0f,
    0.5f,  0.5f,  0.5f,  1.0f, 0.0f,
   -0.5f,  0.5f,  0.5f,  0.0f, 0.0f,
   -0.5f,  0.5f, -0.5f,  0.0f, 1.0f
};

数据处理

GLuint VBO , VAO ;
unsigned int squareIndicesCount = 0;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glBindVertexArray(VAO);

glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*)(0 * sizeof(GLfloat)));
glEnableVertexAttribArray(0);


//纹理坐标, 纹理坐标用的三角形坐标一致
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
glEnableVertexAttribArray(2);

//解绑VAO
glBindVertexArray(0);
squareIndicesCount = sizeof(vertices)/(sizeof(vertices[0]) * 5);

修改Draw方法

glDrawArrays(GL_TRIANGLES, 0, squareIndicesCount);

最后效果:


最后效果

相关文章

  • LearnOpenGL 坐标系统(2)

    解决 : LearnOpenGL 坐标系统(1)[https://www.jianshu.com/p/56002a...

  • LearnOpenGL 坐标系统(1)

    五个坐标系统 局部空间(物体空间) 世界空间 观察空间 裁剪空间 屏幕空间 五个坐标系统的概念 : 坐标系统[ht...

  • [OpenGL]Visaul Studio 环境搭建

    本文仅描述在 Windows 系统上如何搭建 OpenGL 开发环境,关于其他系统,可以参考LearnOpenGL...

  • LearnOpenGL 入门篇

    官方教程 :LearnOpenGL-CN[https://learnopengl-cn.readthedocs.i...

  • OpenGL学习资料和记录

    学习资料 OpenGL: LearnOpenGL[https://learnopengl.com/] 计算机图形/...

  • HDR

    参考资料 LearnOpenGL - HDR[https://learnopengl.com/Advanced-L...

  • 03-OpenGL坐标系

    2D笛卡尔坐标 在二维绘图中,最为常用的坐标系统是笛卡尔坐标系统. 笛卡尔坐标由一个X和一个Y坐标构成.X表示水平...

  • OpenGL 坐标系解析

    2D笛卡尔坐标 在二维绘图中,最为常用的坐标系统是笛卡尔坐标系统. 笛卡尔坐标由一个X和一个Y坐标构成.X表示水平...

  • 地图投影以及Proj4的使用

    地理坐标系统和投影坐标系统 地理坐标系统(Geographic coordinate system) :地理坐标系...

  • opengl相关资料

    推荐度较高的opengl教程:《learnopengl》中文版https://learnopengl-cn.git...

网友评论

      本文标题:LearnOpenGL 坐标系统(2)

      本文链接:https://www.haomeiwen.com/subject/rquluktx.html