计算机图形学 | 实验二:绘制一个三角形

计算机图形学代码之三角形绘制 计算机图形学代码之三角形绘制(实验三) 使用软件vc++ 代码是C语言的 此代码教程配合以下这本书的(版本升级也没有关系) 此代码并不是课本上的思路,稍微取巧了。 思路讲解: 由于在平面上点 了3个点,3个点连成3条线,因此知道了3条直线的方程。 因为知道了方程,所以可以从一条直线出发(设为t1),从t1开始顺着t1出发,同时向其他1条线相连,使用已经现成的写直线的代码即可。 #include ... 阅读详情

华中科技大学《计算机图形学》课程

MOOC地址:计算机图形学(HUST)

计算机图形学 | 实验二:绘制一个三角形

在正式搭建环境之前,我们先来介绍一下读完下面的部分你会了解些什么。

  • 基础绘制的过程,包括初始化,顶点输入,数据处理,着色器计算以及渲染
  • 用VAO/VBO的方式绘制三角形

接下来,我们来介绍一下绘制三角形。绘制效果如下:

在这里插入图片描述

初始化

在代码的开始部分,我们依然对OpenGL进行一个初始化,其中就包括初始化GLFW,创建窗口,初始化GLAD,创建视口这四个部分。

// 初始化GLFW glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_RESIZABLE, FALSE);
// 创建窗口(宽、高、窗口名称)
auto window = glfwCreateWindow(screen_width, screen_height, "Triangle", nullptr, nullptr);
if (window == nullptr)
{
	std::cout << "Failed to Create OpenGL Context" << std::endl;
	glfwTerminate();
	return -1;
}
glfwMakeContextCurrent(window);
// 初始化GLAD,加载OpenGL函数指针地址的函数
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
	std::cout << "Failed to initialize GLAD" << std::endl;
	return -1;
}
// 指定当前视口尺寸(前两个参数为左下角位置,后两个参数是渲染窗口宽、高)
glViewport(0, 0, screen_width, screen_height);

顶点输入

初始化之后,我们需要给出我们三角形的顶点数据,并对数据做出一些处理,包括生成绑定VAO、VBO和属性设置,最后将其解绑。

// 三角形的顶点数据
const float triangle[] =
{
	// ---- 位置 ----
	-0.5f, -0.5f, 0.0f, // 左下
	0.5f, -0.5f, 0.0f, // 右下
	0.0f, 0.5f, 0.0f // 正上
};

由于我们绘制的是一个三角形,因此我们的顶点数据由三个顶点 组成。这里的顶点数据是标准化的设备坐标,也就是x,y,z轴坐标均映射到[-1, 1]之间。

数据处理

VAO、VBO

我们有了顶点数据,接下来就是要将这些顶点数据发送到GPU中去处理,这里我们生成了一个顶点缓冲对象VBO,并且将其绑定到顶点缓冲对象上,使用这个顶点缓冲对象的好处是我们不用将顶点数据一个一个的发送到显卡,而是可以借助VBO一次性的发送一大批数据过去,然后使用glBufferData将顶点数据绑定到当前默认的缓冲上,这里的GL_STATIC_DRAW表示我们的三角形位置数据不会被改变。

// 生成并绑定VBO
GLuint vertex_buffer_object;
glGenBuffers(1, &vertex_buffer_object);
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_object);
// 将顶点数据绑定至当前默认的缓冲中
glBufferData(GL_ARRAY_BUFFER, sizeof(triangle), triangle, GL_STATIC_DRAW);

这里我们还生成了一个顶点数组对象VAO,使用VAO的原因是首先我们使用的核心模式要求我们需要使用VAO,其次使用VAO的好处在于我们在渲染的时候只需要调用一次VAO就可以了,之前的数据都对应存储在了VAO中,不用再调用VBO。那么VAO的生成过程也跟VBO一样,需要先生成再绑定,等到这些操作都进行完,我们可以解绑我们的VAO,VBO。

// 生成并绑定VAO
GLuint vertex_array_object;
glGenVertexArrays(1, &vertex_array_object);
glBindVertexArray(vertex_array_object);

发送到GPU之后我们还需要告诉OpenGL我们如何解释这些顶点数据。因此我们用glVertexAttribPointer这个函数告诉OpenGL我们如何解释这些顶点数据。

顶点属性

// 设置顶点属性指针 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); 
glEnableVertexAttribArray(0);

这个函数第一个参数是我们后面会用到的顶点着色器的位置值,3表示的是顶点属性是一个三分量的向量,第三个参数表示的是我们顶点的类型,第四个是我们是否希望数据被标准化,就是映射到0-1之间,第五个参数叫做步长,它表示连续顶点属性之间的间隔,因为我们这里只有顶点的位置,所以我们将步长设置为这个,表示下组数据在3个float之后。最后一个是数据的偏移量,这里我们的位置属性是在数组的开头,因此这里是0,并且由于参数类型的限制,我们需要将其进行强制类型转换。

而下面Enable的函数则是表明我们开启了0的这个通道,默认状态下是关闭的,因此我们在这里要开启一下。
等到设置属性指针完成之后,我们这里需要解绑VAO和VBO。那么,我们可以思考一下,为什么我们在这里要解绑VAO和VBO呢?

一个原因是因为在防止之后再继续绑定VAO的时候会影响当前的VAO,另一个原因是为了使代码更加灵活规范,在渲染需要的时候我们会再绑定VAO。

我们已经通过VAO、VBO将顶点数据储存在显卡的GPU上了,接下来我们会创建顶点和片段着色器真正处理这些数据。这里我们会给出着色器的源码,然后生成并编译着色器,最后将顶点和片段着色器链接到一个着色器程序,在之后的渲染流程中我们会使用这个着色器程序,最后将之前的着色器删除。

顶点着色器和片段着色器

这里我们给出的这两段分别是顶点着色器的源码和片段着色器的源码,这个是用GLSL语言来编写的,而且这个GLSL语言看起来与C语言的风格类似,很容易懂。我们先看顶点着色器,第一行表示我们使用的是OpenGL3.3的核心模式,第二行就是我们之前说到的位置值。Main函数中的部分就是将我们之前的顶点数据直接输出到GLSL已经定义好的一个内建变量gl_Position中,这个就是我们顶点着色器的输出,也就是说我们在顶点着色器这里什么都没做,就只是将顶点位置作为顶点着色器的输出。

// 顶点着色器源码
const char *vertex_shader_source = "#version 330 core\n"
	"layout (location = 0) in vec3 aPos;\n"
	"void main()\n"
	"{\n" " gl_Position = vec4(aPos, 1.0);\n" "}\n\0";

接下来是片段着色器,前面两行类似,这里的out表示输出变量,就像之前的in表示输入变量。然后我们这里的四分量向量就是我们之前看到的三角形是红色的来源,是一个四分量的RGBA,那么我们也可以将其更改一下,我们输出的三角形颜色就会发生变化。

// 片段着色器源码
const char *fragment_shader_source =
	"#version 330 core\n" "out vec4 FragColor;\n"
	"void main()\n"
	"{\n" " FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" "}\n\0";

有了顶点和片段着色器的源码,我们还需要生成和编译着色器,那么这里我们先生成了顶点着色器,并且附加上了之前的源码,将其进行编译,然后我们这里对其进行检测,是否成功编译,如果编译不成功就打印错误信息。

同样的片段着色器也是一样的。

最后我们将顶点和片段着色器链接到一个着色器程序中,这样我们在渲染时只需要调用一个着色器程序就可以了,同样这里我们检测了一下链接是否成功。

最后删除掉顶点和片段着色器。因为在后面渲染的时候我们只需要用那个我们之前链接好的着色器程序就可以了,不需要再使用顶点和片段着色器了。

渲染

接下来我们进入我们的渲染阶段,当窗口没有关闭的时候我们就一直进行渲染。首先我们先清空颜色缓冲,我们这里用的是黑色的背景色来清空屏幕颜色缓冲,当然这里我们可以更换颜色。接下来我们使用我们之前已经链接好的着色器程序,和VAO,来绘制三角形,绘制三角形其实只要一句话,就是这个glDrawArrays。这里的第一个参数表示我们是要绘制三角形,第二个参数表示我们顶点数组的起始索引值,第三个参数表示我们要绘制的顶点数量,这里绘制三角形我们要绘制三个顶点。绘制结束后解除绑定。最后我们会交换一下缓冲,这里我们使用的是一个双缓冲的做法,前缓冲保存着输出的图像,而渲染指令都在后缓冲中进行,当指令执行完毕后我们交换前后缓冲,最后我们还会检测是否有触发一些回调函数。

// 使用着色器程序
glUseProgram(shader_program); 
// 绘制三角形 
glBindVertexArray(vertex_array_object);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindVertexArray(0);

当我们的窗口关闭之后,我们还会进行一些善后工作,这里包括删除我们之前所创建的VAO、VBO,以及调用GLFW的函数来清理所有的资源并退出程序。

整个绘制三角形的程序就到此为止。

我们回头再来梳理一遍绘制三角形流程,刚开始我们先初始化OpenGL,接下来对我们的数据进行处理,通过VAO、VBO将其发送至GPU中,并设置属性指针告诉GPU我们会如何解释这些数据,然后在着色器中通过顶点和片段着色器对数据进行处理,最后进行渲染,渲染之后做好我们的善后工作,一个三角形就绘制成功了。效果如下:

在这里插入图片描述

完整代码:

/***
* 例程  绘制三角形 (MAKE后运行时可删除ALL_BUILD,也可以将Task-triangle设为默认启动工程)
* 步骤:
* 1-初始化:   GLFW窗口,GLAD。
* 2-数据处理: 给定顶点数据,生成并绑定VAO&VBO(准备在GPU中进行处理),设置顶点属性指针(本质上就是告诉OpenGL如何处理数据)。
* 3-着色器:   给出顶点和片段着色器,然后链接为着色器程序,渲染时使用着色器程序。
* 4-渲染:     清空缓冲,绑定纹理,使用着色器程序,绘制三角形,交换缓冲区检查触发事件后释放资源
*/

#include <iostream>
#include "glad/glad.h"
#include "GLFW/glfw3.h"

// 三角形的顶点数据
const float triangle[] =
{
	//---- 位置 ---- 
	-0.5f, -0.5f, 0.0f,   // 左下
	0.5f, -0.5f, 0.0f,   // 右下
	0.0f,  0.5f, 0.0f    // 正上
};

// 屏幕宽,高
int screen_width = 1280;
int screen_height = 720;

int main()
{
	glfwInit();// 初始化GLFW
	// OpenGL版本为3.3,主次版本号均设为3
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);// 使用核心模式(无需向后兼容性)
	//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);// 如果使用的是Mac OS X系统,需加上这行
	glfwWindowHint(GLFW_RESIZABLE, false);// 不可改变窗口大小
	// 创建窗口(宽、高、窗口名称)
	auto window = glfwCreateWindow(screen_width, screen_height, "Triangle", nullptr, nullptr);
	if (window == nullptr)
	{
		// 如果窗口创建失败,输出Failed to Create OpenGL Context
		std::cout << "Failed to Create OpenGL Context" << std::endl;
		glfwTerminate();
		return -1;
	}
	glfwMakeContextCurrent(window);// 将窗口的上下文设置为当前线程的主上下文
	// 初始化GLAD,加载OpenGL函数指针地址的函数
	if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
	{
		std::cout << "Failed to initialize GLAD" << std::endl;
		return -1;
	}
	// 指定当前视口尺寸(前两个参数为左下角位置,后两个参数是渲染窗口宽、高)
	glViewport(0, 0, screen_width, screen_height);
	// 生成并绑定VAO和VBO
	GLuint vertex_array_object; // == VAO
	glGenVertexArrays(1, &vertex_array_object);
	glBindVertexArray(vertex_array_object);
	GLuint vertex_buffer_object; // == VBO
	glGenBuffers(1, &vertex_buffer_object);
	glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_object);
	// 将顶点数据绑定至当前默认的缓冲中
	glBufferData(GL_ARRAY_BUFFER, sizeof(triangle), triangle, GL_STATIC_DRAW);
	// 设置顶点属性指针
	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
	glEnableVertexAttribArray(0);
	// 解绑VAO和VBO
	glBindVertexArray(0);
	glBindBuffer(GL_ARRAY_BUFFER, 0);
	// 顶点着色器和片段着色器源码
	const char *vertex_shader_source =
		"#version 330 core\n"
		"layout (location = 0) in vec3 aPos;\n"           // 位置变量的属性位置值为0
		"void main()\n"
		"{\n"
		"    gl_Position = vec4(aPos, 1.0);\n"
		"}\n\0";
	const char *fragment_shader_source =
		"#version 330 core\n"
		"out vec4 FragColor;\n"                           // 输出的颜色向量
		"void main()\n"
		"{\n"
		"    FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
		"}\n\0";
	// 生成并编译着色器
	// 顶点着色器
	int vertex_shader = glCreateShader(GL_VERTEX_SHADER);
	glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL);
	glCompileShader(vertex_shader);
	int success;
	char info_log[512];
	// 检查着色器是否成功编译,如果编译失败,打印错误信息
	glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success);
	if (!success)
	{
		glGetShaderInfoLog(vertex_shader, 512, NULL, info_log);
		std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << info_log << std::endl;
	}
	// 片段着色器
	int fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
	glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL);
	glCompileShader(fragment_shader);
	// 检查着色器是否成功编译,如果编译失败,打印错误信息
	glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success);
	if (!success)
	{
		glGetShaderInfoLog(fragment_shader, 512, NULL, info_log);
		std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << info_log << std::endl;
	}
	// 链接顶点和片段着色器至一个着色器程序
	int shader_program = glCreateProgram();
	glAttachShader(shader_program, vertex_shader);
	glAttachShader(shader_program, fragment_shader);
	glLinkProgram(shader_program);
	// 检查着色器是否成功链接,如果链接失败,打印错误信息
	glGetProgramiv(shader_program, GL_LINK_STATUS, &success);
	if (!success)
	{
		glGetProgramInfoLog(shader_program, 512, NULL, info_log);
		std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << info_log << std::endl;
	}
	// 删除着色器
	glDeleteShader(vertex_shader);
	glDeleteShader(fragment_shader);
	// 线框模式
	//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
	// 渲染循环
	while (!glfwWindowShouldClose(window))
	{
		// 清空颜色缓冲
		glClearColor(0.0f, 0.34f, 0.57f, 1.0f);
		glClear(GL_COLOR_BUFFER_BIT);
		// 使用着色器程序
		glUseProgram(shader_program);
		// 绘制三角形
		glBindVertexArray(vertex_array_object);// 绑定VAO
		glDrawArrays(GL_TRIANGLES, 0, 3);// 绘制三角形
		glBindVertexArray(0);// 解除绑定
		// 交换缓冲并且检查是否有触发事件(比如键盘输入、鼠标移动等)
		glfwSwapBuffers(window);
		glfwPollEvents();
	}
	// 删除VAO和VBO
	glDeleteVertexArrays(1, &vertex_array_object);
	glDeleteBuffers(1, &vertex_buffer_object);
	// 清理所有的资源并正确退出程序
	glfwTerminate();

	return 0;
}

计算机图形学实验 文章目录实验介绍实验内容实验一实验二实验三实验四实验五实验源码 实验介绍 大二学期的计算机图形学课程,内容包含扫描转换算法,裁剪算法,图形变换,三维图形投影和消隐,曲线和曲面;从完成情况来看虽算不上十分出色,但也花了很多时间和精力,代码必然存在一些冗余、不足和待改进之处,故公开和大家交流和参考 实验内容 实验一 (●’◡’●) 效果展示 实验题1-1:绘制任意斜率的直线 实验题1-3:用中点画圆法画圆 实验题1-4:中点画圆法画椭圆 实验题1-5:中点画圆法画圆弧 实 阅读详情

相关推荐

计算机图形学——简单图形绘制

图元的绘制 1.在屏幕上绘制几何图元(如下图所示),自定义坐标和颜色。 2.采用中点圆算法在屏幕上画一个圆。 二、实验环境 dev-c IDE MinGW32编译器 opengl若干拓展包 三、实验一 在屏幕上绘制几何图元,自定义坐标和颜色。 较为熟练的使用函数库。 实验结果 四、实验二 采用中点圆算法在屏幕中画一个圆。 算法: MidPointCircl算法画出1/8个圆 利用圆的八...

m0_46601288的博客 7033

计算机图形学 || 画简单三角形并利用ImGUI改变三角形颜色

GUI and Draw simple graphics 基础知识 学习来源 learnOpenGL 重要概念 顶点数组对象(VAO) 顶点缓冲对象(VBO) 索引缓冲对象(EBO) 图形渲染管线 3D坐标转为2D像素的处理过程是由OpenGL的图形渲染管线管理的,它分为两部分工作。 第一部分把3D坐标转为适应屏幕的2D坐标。 第二部分把2D坐标转变为实际有颜色的像素。 顶点输入 标准化设...

perry0528的博客 3958

计算机图形学五角星c语言,计算机图形学实验——利用OpenGL函数绘制五角星

一、实验名称:五角星的绘制二、实验目的:了解 OpenGL 程序设计结构,掌握编程环三、境的设置,掌握绘制线段的方法。四、实验内容:1.在 VC++ 环境下 ,练习利用 OpenGL 绘制三角形的程序。2.编程实现绘制一个五角星。(传统 OpenGL 或者 Shader)五、实验所需基本函数1.线段绘制glBegin(GL_LINES);//绘制参数GL_LINESglVertex2f(30,30...

weixin_33268492的博客 3890

计算机图形学第二次作业:画三角形

文章目录1.画三角形Step:代码重点部分详细算法及函数解释可见源代码`firstsol.cpp`注释2.画红绿蓝三角形代码重点部分详细算法及函数解释可见源代码`secondsol.cpp myshader.cpp myshader.h`注释3.添加GUI改变颜色,顺便完成bonus:绘制两个三角形以及点和线代码重点部分详细算法及函数解释可见源代码`thirdsol.cpp`注释 1.画三角形 ...

羊城迷鹿的博客 4746

孔令德的计算机图形学课程实验

授课总学时64,实验项目学时12  实验一  绘制任意斜率的直线(2学时)        验证性 实验内容:利用中点Bresenham算法,编程实现绘制任意斜率的直线。 基本要求: 1. 掌握中点Bresenham算法的原理和算法; 2. 使用鼠标在屏幕上绘制任意斜率的直线; 实验拓展:彩色直线与反走样直线。   实验二  交互式绘制多边形(2学时)  

klingde的专栏 1万+

计算机图形学绘画多重三角形

计算机图形学OpenGL语言的多重三角形代码实现,主要运行软件为Visual Studio 2015

计算机图形学 画三角形、圆等(入门代码)

【要求】 实现自己的三角形线框显示算法,能够将三角形的各个顶点经过坐标变换后变换到屏幕坐标,并以连线的方式将三角形的各个边显示出来。要求连线不使用Windows API,而是利用自己的2D Line算法,例如:2DDA算法。 方法1 DDA算法 理论学习 参考博客博客1 博客2 代码(创建glut工程) #include<windows.h> #include<bits/stdc++.h> #include <GL/glut.h> usi...

ccsu_deer 2999

计算机图形学的基本三角形,四边形,扇形画法代码

计基于opengl的计算机图形学的基本三角形,四边形,扇形画法代码

图形学基础:第4章 画三角形

三角形填充 重心坐标

何所为何所不为 3752

计算机图形学openGL画三角形

计算机图形学用openGL画三角形源代码,可以改变数据实现三角形颜色的变换。要求配置好openGL配置环境

计算机图形学单击鼠标绘制三角形自动

绘制三角形 鼠标点击,利用鼠标点击指定顶点坐标(标准化坐标):标准坐标是三个点,可以分别理解为X坐标、Y坐标、Z坐标。原点位于屏幕中央,X坐标在原点的左右方向,Y坐标在原点的上下方向,每个坐标的取值都在-1到1之间,这是一种相对距离,比如说x为-1就表面这个点在最左边,x为1就表明这个点在最右边。 用着色器语言GLSL(OpenGL Shading Language)编写顶点着色器,然后编译这个着色器。 用着色器语言GLSL(OpenGL Shading Language)编写片段着色器,然后编译这个着色器。 把编译好的着色器链接(Link)为一个着色器程序对象,然后在渲染对象的时候激活这个着色器程序。 链接顶点属性。 ————————————————

计算机图形学实验一(二维图形绘制)

计算机图形学实验一(二维图形绘制)一、实验内容 一、实验内容 (1)绘制金刚石图案 金刚石图案的成图规则是:把一个圆周等分成n份,然后每两点之间连线。当n取奇数时,该图案可一笔连续绘成,即用MoveTo函数确定一个当前点,然后连续用LineTo函数连点成 线。请设计连线规则并编程实现 (2)绘制魔术三角形 绘制下图所示的魔术三角形图案 ,采用三种可明显区分的颜色填充。 (3)绘制递归圆 应用递归的方法绘制如下所示的图案。 ...

南方硅人的博客 7664

计算机图形学实验-三角形

绘制三角形,并填充,使其显示三种不同颜色...多彩三角形...

计算机图形学 | 实验四:绘制一个球体

计算机图形学 | 实验四:绘制一个球体

ProgramNovice的博客 3161

模电专题-MOS管的放大电路分析

在实际应用中,我们经常会使用到功率MOS,这时通常不会将它当成一个开关使用,而是当成一个放大器来使用,那这就需要让其工作在放大状态。参考下图中的mos管的特性曲线,右图中的输出特性曲线中有一根红色的分界线,这个线就是区分mos管工作状态的分界线,在红线的左边,mos管工作在可变电阻区,也就是线性区;在红线的右边mos管工作在恒流区,也就是饱和区。当然,还有一个截止区。本文分析主要运用模电课本中的理论计算验证。

Anitawen的博客 2万+

TSMC 65nm PDK衬底文件转换避坑记:从.itf到.itd,解决ADS导入乱码与金属层缺失

本文详细解析了TSMC 65nm PDK衬底文件从.itf到.itd转换过程中的常见问题及解决方案,包括ADS导入乱码与金属层缺失的修复方法。通过环境准备、文件定位、转换操作和问题诊断的完整流程,帮助工程师高效完成衬底文件转换,确保电磁仿真精度。

weixin_30855099的博客 301

计算机图形学 实验1 《实验环境配置和基本图元绘制》

计算机图形学 实验1 《实验环境配置和基本图元绘制》 一、实验目的 配置基本实验环境、安装软件包、建立工程和绘制基本图元,要求学会点、线、三角形、四边形的绘制方法,学会消息传递和响应机制,用一个实例完成上述要求。 二、实验内容 1、配置OpenGL绘图环境; 2、绘制点、线、三角形、四边形等基本图元。 三、实验方法 以Visual Studio 2019为开发环境,合理配置第三方glut相关文件(部署glut头文件、glut动态链接库、glut.lib类型库),并且使用OpenGL的基本绘制模式(包括GL_

Atlas 5425

SRAM Bank数量配置:性能、面积与功耗的权衡指南

SRAM(静态随机存取存储器)是芯片设计中的关键存储单元,其Bank数量配置直接影响访问延迟、吞吐率、功耗和面积。Bank切分通过将存储阵列分区,缩短位线和字线延迟,从而提升性能,但会增加外围电路开销。合理配置Bank数量可优化PPA(性能、功耗、面积),在28nm和16nm工艺下,2个Bank通常是性价比最高的选择。本文基于实测数据,探讨不同场景下的Bank配置策略,帮助工程师避免常见误区,提升设计效率。

weixin_27230891的博客 179

【计算机图形学】实验一:二维图形绘制

金刚石图案的成图规则是:把一个圆周等分成nnn份,然后每两点之间连线。当nnn取奇数时,该图案可一笔连续绘成,即用MoveTo函数确定一个当前点,然后连续用LineTo函数连点成线。 请设计连线规则并编程实现。绘制下图所示的魔术三角形图案 ,采用三种可明显区分的颜色填充。 应用递归的方法绘制如下所示的图案。 Visual Studio 2019 图形学实验程序框架 Windows11系统对于问题1,首先需要计算出图案上各个像素点的坐标,设图案上有nnn个点,图案中心点坐标(xm,ym)(x_m,y_m)(x

zombotany的博客 3280

一个三极管和稳压管构成的简易稳压电源

一、对电压精度要求不高的场所可以使用本文中所述的简易稳压电源(电流变化引起 的基极-发射极的压降 变化 对输出电压来说可以容忍)二、根据负载实际需求选择三极管,不同的三极管集电极电流不同,电流放大倍数不同(1、尽量选择负载电流(iC 或 iE)上限时,hFE仍然比较理想的三极管,2、一般三极管对基极电流没有限制,可以适当调整基极电流以获得所需输出电流)

五花带点肉 1万+

matlab液体湿润模拟,【水文模型】01 三水源新安江模型

目录一、概述1.1 流域概况1.2 产流方式论证1.3 设计基本任务1.4 设计原始资料二、新安江模型2.1 流域划分2.2 产汇流计算2.2.1 蒸散发计算2.2.2 产流计算2.2.3 水源划分2.2.4 汇流计算2.3 模型参数2.3.1 参数物理意义2.3.2 参数率定结果2.4 模拟结果2.4.1 精度统计表2.4.2 计算与实测流量过程线比较三、精度统计与误差分析3.1 精度统计3.2...

weixin_34173656的博客 5328

计算机图形学OpenGL实验——实现三维空间、视野方向转换

计算机图形学实验,用OpenGL实现三维空间,绘制三维房间、家具、房屋建筑等。 用到的OpenGL 函数 glColor3f(blue); //设置颜色 glutSolidCube(size);//绘制正方体 glVertex3f(x, y, z);//设置点坐标 glLightfv(a,b,c); //设置光源 glTranslatef(x, y, z`)`;//平移函数 gl...

weixin_43576525的博客 1万+

手把手教你学Simulink实例:基于Simulink的超级电容器充放电仿真

超级电容器(Supercapacitor)是一种高容量电容器,具有快速充放电能力、长寿命和高功率密度等优点。它在能量存储系统、电动汽车、不间断电源(UPS)等领域有广泛应用。为了更好地理解和设计超级电容器的应用系统,通常需要进行详细的仿真分析。Simulink 提供了一个强大的仿真环境,可以用来设计、分析和验证超级电容器充放电系统的控制策略。本教程将详细介绍如何使用 Simulink 进行超级电容器充放电的仿真实例。通过本教程,我们详细介绍了如何使用 Simulink 进行超级电容器充放电的仿真实例。

MHD0815的博客 581

计算机图形学学习(一)——线的绘制、三角形填充绘制

以下摘抄自本人的计算机图形学上机报告本次直线的绘制采用的是中点画线法。

2301_78796401的博客 1531

药物对接仿真软件:HADDOCK_(5).HADDOCK中蛋白质-配体对接流程

半柔性能量最小化阶段是在刚体能量最小化的基础上,允许配体的部分柔性,通过优化配体的构象来进一步提高对接的准确性。半柔性能量最小化阶段是在刚体能量最小化的基础上,允许配体的部分柔性,通过优化配体的构象来进一步提高对接的准确性。如果是PDB格式,确保文件包含所有必要的原子信息。对接完成后,HADDOCK会生成一系列的输出文件,包括对接后的蛋白质-配体复合物结构文件、能量评分文件和统计分析文件。对接完成后,HADDOCK会生成一系列的输出文件,包括对接后的蛋白质-配体复合物结构文件、能量评分文件和统计分析文件。

kkchenjj的博客 1086

HFSS实战项目——微带一分四功分器

呕心沥血保姆级教程!!!!手把手教会你做功分器,史上最详细步骤!!!

2401_87464239的博客 2676
上一篇: 计算机图形学 | 实验一:绘制一个窗口
下一篇: Qt Creator 5.6.1-1 的下载与安装
UestcXiye
博客等级 码龄8年 9032粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值