首页 > 其他分享 >任意的形如 z = F(x,y)的曲面生成与显示---基于OpenGL Core Profile

任意的形如 z = F(x,y)的曲面生成与显示---基于OpenGL Core Profile

时间:2022-11-01 16:01:50浏览次数:69  
标签:Profile Core 个点 OpenGL 0.5 生成 索引 文件夹 坐标

运行结果:

  (圆锥面)

(抛物面)

(马鞍面)


其中的做法是:从顶部看上去就是一个平面网格、每个点的 z、x的位置都是程序细分出来的(指定起始、结束、步长)、比较固定、但高度 y 的计算使用 用户指定的函数去计算

把每个顶点的信息传入 vbo、再计算出每个三角面片的索引号、传入ebo、最后glDrawElement()进行绘制!

由于这是opengl而不是高等数学、所以y应该是向上的、这些细节在生成点的时候可以交换一下变量从而得到解决

同样应该把这种模型封装到类里。

相关的成员变量:

Xs:X坐标的start

Xe:X坐标的end

Y同理

Fxy:用 stl 的方法传递函数、而不是用函数指针

pointCount:指出有多少个顶点、用于给vbo传数据

totalIndices:指出ebo有多少个索引元素、绘制时有用

Q:一列有多少个点

P:一行有多少个点

传递函数到类内、并保存起来的的代码:

	void setFunction(std::function<float(float, float)> fxy) {
		
		this->Fxy = fxy;
		this->isFunctionInit = true;
	}

计算PQ的代码: 可以先带个小的数验算一下: 比如 从【-1,1】、delta = 0.5,那就是 -1, -0.5 , 0 ,0.5, 1 五个点、确实等于 ((1-(-1))/0.5)+1

总的点数那么肯定是 Q*P 了

	Q = ((Ye - Ys) / delta ) + 1 ;
     P = ((Xe - Xs) / delta) + 1; pointCount = Q * P;

 

接下来就可以程序化生成点和索引号了:

生成点的代码是从第一列开始、然后每列处理完了就进行下一列

所以可以知道、这个网格的左上角的点是第一个被处理的、它的坐标是(0,0)索引是 0

从而 定义一个 index宏 表示网格上 以 x,y 为坐标(不是实际的浮点数坐标、而是从 j ∈ [0...Q - 1], i ∈  [0...P - 1]的逻辑坐标)对应的点在 vbo 内的索引号

比如: (0,0)--> 0  : 左上角的点是第0个点

    (1,0)--> col = Q  左上角的那个点的右邻居确实索引是 Q、 因为第一列点的索引是从 [0....Q-1] (共Q个点)

总共的索引数是 (P-1)*(Q-1)* 6  ,因为如果有 P 个点、那么就有 P -1 个间距、从而整个网只有 (P-1)*(Q-1)个正方块、我们用三角形再切开每个面、需要两个三角形、每个三角形又有三个顶点必须指定。

从这张图可以清楚分析出哪几个点应该是一个三角面片

后面生成VAO、VBO、EBO的代码就不用多说了!!注意思考好到底开多大的显存!这里很容易算错

 1 #define index(x,y,col) (x)*(col)+(y)
 2 
 3 void FuncMesh::genMesh() {
 4     if (this->isFunctionInit == false) {
 5         return;
 6     }
 7 
 8     auto points = new Vector3[pointCount];
 9     size_t id1 = 0;
10     for (float curX = Xs; curX <= Xe ; curX += deltaH)
11     {
12         for (float curY = Ys; curY <= Ye ; curY+= deltaH)
13         {
14             Vector3 v3;
15             v3.x = curX;
16             v3.z = curY;
17             v3.y = Fxy(curX, curY);
18             points[id1] = v3;
19             id1++;
20         }
21     }
22     totalIndices = (P-1) * (Q-1) * 6;
23     GLuint* eboArr = new GLuint[totalIndices];25   
24 for (size_t i = 0; i <= P-2; i++) 26 { 27 for (size_t j = 0; j <= Q-2; j++) 28 { 29 eboArr[k++] = index(i, j, Q); 30 eboArr[k++] = index(i+1, j, Q); 31 eboArr[k++] = index(i, j+1, Q); 32 33 eboArr[k++] = index(i, j+1, Q); 34 eboArr[k++] = index(i+1, j, Q); 35 eboArr[k++] = index(i+1, j+1, Q); 36 } 37 } 38 GLuint vbo; 39 GLuint ebo; 40 41 42 glGenVertexArrays(1,&vao); 43 glBindVertexArray(vao); 44 45 glGenBuffers(1, &vbo); 46 glBindBuffer(GL_ARRAY_BUFFER, vbo); 47 glBufferData(GL_ARRAY_BUFFER, pointCount*(sizeof(Vector3)), points, GL_STATIC_DRAW); 48 glEnableVertexAttribArray(0); 49 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 50 51 glGenBuffers(1, &ebo); 52 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo); 53 glBufferData(GL_ELEMENT_ARRAY_BUFFER, totalIndices * sizeof(GLuint), eboArr, GL_STATIC_DRAW); 54 55 glBindVertexArray(0); 56 57 }

vshader的话、就用一个简单的MVP矩阵变换、

fshader的话、就用一个简单的输出单一颜色即可

 


 

顺便说一下VS中配置相对路径从而引用第三方库到底怎么写:

比如我的目录:

  

        --》包含

        

        Project1中是:

            

                这个黄色箭头指向的文件夹里有vs的项目文件:

                

          third中是:

            

 那么、我们在VS中要配置附加包含目录和附加库目录、其实就是相对那个 vxproj 进行配置的!

右击---》属性

..\..\  表示往父级后退两步、从哪里开始退呢?就是从 vxproj (一个solution里可能有多个project、以目前右击的那个为准)所在的那个文件夹处后退两步、可以看到这确实会退到只有 {Project1、third} 这两个文件夹的那个文件夹、然后再步进到third中就行了!

完整的工程下载(自带一堆三方库):

链接:https://pan.baidu.com/s/1KWGrK8yfddlHCVolBWn2sA
提取码:bby7

标签:Profile,Core,个点,OpenGL,0.5,生成,索引,文件夹,坐标
From: https://www.cnblogs.com/gs590/p/16848008.html

相关文章

  • 阿里云OSS前端web直传 .net C# .net core
    背景阿里云oss使用web直接上传的有两种方式1.是通过阿里云自己的jssdk上传,但是这种上传方式有个比较麻烦的地方,获取授权的时候配置会比较麻烦2.通过form表单提交......
  • SQL Server性能优化工具Profiler
    SQLServerProfiler是什么SQLServerProfiler是一个界面,用于创建和管理跟踪并分析和重播跟踪结果。 这些事件保存在一个跟踪文件中,稍后试图诊断问题时,可以对该文件进行......
  • ASP.NET Core教程-跨域配置(CORS Configuration)
    更新记录转载请注明出处:2022年11月1日发布。2022年11月1日从笔记迁移到博客。说明Cross-OriginResourceSharing,跨域资源共享配置方式在ASP.NETCore中有2种方......
  • VSCode + Mingw64配置OpenGL环境
    前言最近在复习LearningOpenGL,以前学的时候是根据书的介绍直接使用VS2022来配置OpenGL的开发环境,根据书的操作使用Cmake构建glfw3,添加glad,然后正确设置项目以来并且正确......
  • 【WPF依赖注入】开篇. NET Core 控制反转(IoC)和依赖注入(DI) IServiceCollection
    参考Microsoft.Extensions.DependencyInjection入门https://www.cnblogs.com/zcqiand/p/14257661.html原文:NETCore依赖注入的IServiceCollection 前置阅读在阅......
  • C# net core 从文件流中获取文件头、匹配文件类型
    常用文件的文件头如下:(以前六位为准)JPEG(jpg),文件头:FFD8FFPNG(png),文件头:89504E47GIF(gif),文件头:47494638TIFF(tif),文件头:49492A00WindowsBitmap(bmp),文件头:4......
  • 二、.Net Core搭建Ocelot
    Ocelot是系统中对外暴露的一个请求入口,所有外部接口都必须通过这个网关才能向下游API发出请求1、Nuget引用Ocelot(注意版本,我用的是16.0.1)2、根目录添加配置文件Ocelot.js......
  • Solr 8.11入门教程(2)创建core
    新建core添加core命令添加使用命令比较简单~$bin/solrcreate-cmytest[core名称]这样就添加完了。CoreAdmin就可以看到了。手动添加手动添加相对复杂一些,需要提......
  • cuda cores
    基本介绍从这个link看的:https://www.techcenturion.com/nvidia-cuda-cores/其中,抽象上这里表述较好理解:LetusconsideranexampletounderstandtheworkingofCUDA......
  • Solr 8.11入门教程(2)创建core
    新建core添加core命令添加使用命令比较简单~$bin/solrcreate-cmytest[core名称]这样就添加完了。CoreAdmin就可以看到了。手动添加手动添加相对复杂一些,需要提前创建目......