ogl 第一个三角形

使用Opengl绘制三角形 OpenGL绘制三角形三角形的平移和旋转 三角形的平移和旋转 对三角形的三个坐标矩阵化,之后乘相应操作的矩阵得到平 移/旋转后的三角形矩阵,并用Opengl函数库进行绘制。 注意:并未使用Opengl中自带的平移与旋转函数。而是根据原理理解后写出的具体操作。 // An highlighted block // sanJiaoxing.cpp: 定义控制台应用程序的入口点。 // #inclu... 阅读详情
#include "../common/common.h"

// Function prototypes
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode);

// Window dimensions
const GLuint WIDTH = 800, HEIGHT = 600;

// Shaders
const GLchar* vertexShaderSource = "#version 330 core\n"
"layout (location = 0) in vec3 position;\n"
"void main()\n"
"{\n"
"gl_Position = vec4(position.x, position.y, position.z, 1.0);\n"
"}\0";
const GLchar* fragmentShaderSource = "#version 330 core\n"
"out vec4 color;\n"
"void main()\n"
"{\n"
"color = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
"}\n\0";

// The MAIN function, from here we start the application and run the game loop
int main()
{
    // Init GLFW
    glfwInit();
    // Set all the required options for GLFW
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);

    // Create a GLFWwindow object that we can use for GLFW's functions
    GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", nullptr, nullptr);
    glfwMakeContextCurrent(window);

    // Set the required callback functions
    glfwSetKeyCallback(window, key_callback);

    // Set this to true so GLEW knows to use a modern approach to retrieving function pointers and extensions
    glewExperimental = GL_TRUE;
    // Initialize GLEW to setup the OpenGL Function pointers
    glewInit();

    // Define the viewport dimensions
    int width, height;
    glfwGetFramebufferSize(window, &width, &height);
    glViewport(0, 0, width, height);


#pragma region Build and compile our shader program 
    // Build and compile our shader program
    // Vertex shader
    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
    glCompileShader(vertexShader);
    // Check for compile time errors
    GLint success;
    GLchar infoLog[512];
    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
    if (!success)
    {
        glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
        std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
    }
    // Fragment shader
    GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
    glCompileShader(fragmentShader);
    // Check for compile time errors
    glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
    if (!success)
    {
        glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
        std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
    }
    // Link shaders
    GLuint shaderProgram = glCreateProgram();
    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);
    glLinkProgram(shaderProgram);
    // Check for linking errors
    glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
    if (!success) {
        glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
        std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
    }
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);
#pragma endregion 


    // Set up vertex data (and buffer(s)) and attribute pointers
    GLfloat vertices[] = {
        -0.5f, -0.5f, 0.0f, // Left  
        0.5f, -0.5f, 0.0f, // Right 
        0.0f, 0.5f, 0.0f  // Top   
    };
    GLuint VBO, VAO;
    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);
    // Bind the Vertex Array Object first, then bind and set vertex buffer(s) and attribute pointer(s).
    glBindVertexArray(VAO);

    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
    glEnableVertexAttribArray(0);

    /* 
       Note that this is allowed, the call to glVertexAttribPointer
       registered VBO as the currently bound vertex 
        buffer object so afterwards we can safely unbind 
        */
    glBindBuffer(GL_ARRAY_BUFFER, 0); 

    glBindVertexArray(0); // Unbind VAO (it's always a good thing to unbind any buffer/array to prevent strange bugs)

    // Game loop
    while (!glfwWindowShouldClose(window))
    {
        // Check if any events have been activiated (key pressed, mouse moved etc.) and call corresponding response functions
        glfwPollEvents();

        // Render
        // Clear the colorbuffer
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        // Draw our first triangle
        glUseProgram(shaderProgram);
        glBindVertexArray(VAO);
        glDrawArrays(GL_TRIANGLES, 0, 3);
        glBindVertexArray(0);

        // Swap the screen buffers
        glfwSwapBuffers(window);
    }
    // Properly de-allocate all resources once they've outlived their purpose
    glDeleteVertexArrays(1, &VAO);
    glDeleteBuffers(1, &VBO);
    // Terminate GLFW, clearing any resources allocated by GLFW.
    glfwTerminate();
    return 0;
}

// Is called whenever a key is pressed/released via GLFW
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode)
{
    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
        glfwSetWindowShouldClose(window, GL_TRUE);
}
详解D3D/OpenGL光栅化(2) 上一篇讨论了D3D/OGL如何将Shader输出的图元顶点坐标及属性转化为其所覆盖像素和像素的属性。本篇将继续地讨论光栅化其他步骤相关的细节。包括Face Cull,Fill Mode, Clipping, 透视矫正等。 阅读详情

相关推荐

详解D3D/OpenGL光栅化(1)

本篇简单地讨论一个问题:给出图元(三角形/线/点)的顶点坐标及颜色,DirectX 3D(D3D)/OpenGL(OGL)如何确定最终在屏幕上画出的结果? 从D3D Pipeline看[1],这些工作是由光栅化(Rasterization)做的,光栅化是D3D/OGL Pipeline中关键的固定功能阶段,其前面的Shader经过基于Vertex/Patch/Geometry的处理后,以为图元基本单位,输出图元各顶点的位置坐标及各种属性(如Color),交由Raster(1)确定图元能覆盖的像素(2)插值

xiaocai 5672

OpenGL 绘制一个三角形带(Triangle Strip)

Homework1:绘制一个三角形#define _STDCALL_SUPPORTED #define _M_IX86 #define GLUT_DISABLE_ATEXIT_HACK #define GLUT_NO_WARNING_DISABLE #include &lt;GL/gl.h&gt; #include &lt;GL/glut.h&gt; void myDisplay(void) ...

Halsey_的博客 5623

shader渲染一个三角形

在OpenGL中,使用shader语言来渲染一个三角形,比较基础

JAVA的OPENGL,JOGL入门实例----不断变色的点阵 (源代码)

JAVA的OPENGL,JOGL入门实例----不断变色的点阵 (源代码)

jacke121的专栏 2655

360可视门铃双摄版数据恢复实战:BIN文件解析与视频重组

本文详细解析了360可视门铃双摄版BIN文件的数据恢复过程,包括文件结构分析、双摄像头数据存储机制及视频重组技术。通过Python开发环境和FFmpeg工具链,成功实现了H.265视频流的解析与重组,为智能家居设备数据恢复提供了实用解决方案。

weixin_29196891的博客 908

基于h5端的视频录制和回溯功能的实现

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

发果叁 3190

openGL学习笔记十一: 绘制带颜色的三角形

代码如下: //顶点数据 包含 位置 颜色 struct Vertex { float x, y, z; float r, g, b; }; //opengl 绘制 static void render(GLFWwindow * window) { glClearColor(0, 0, 0, 1); glClear(GL_COLOR_BUFFER_BIT); //设置三...

哲学天空的博客 1294

dify离线部署

以bge-m3为例,本地部署bge-m3首先在一台能连网的linux服务器上(部署有ollama)创建想要保存模型的文件夹编辑ollama.service,配置ollama模型的保存路径添加模型存储地址将models目录设置属主,必须做,否则ollama无法启动重新加载配置文件并重启ollama测试ollama 运行是否正常最后拉取 bge-m3可在/opt/LLMModels/bge_m3/models目录下看到拉取得模型使用tar命令压缩文件夹。

weixin_42538734的博客 3065

OGL多边形或二次曲面分格化(Tessellation曲面软件细分技术)

现在的光栅化图形渲染技术的核心是绘制大量三角形来组成3D模型,而Tessellation技术就是利用GPU硬件加速,将现有3D模型的三角形拆分得更细小、更细致,也就是大大增加三角形数量,使得渲染对象的表面和边缘更平滑、更精细。直到DX11时代,GPU自身的性能有了长足的进步,硬件上真正具备了细分曲面的实力,再加上微软重新改写API渲染流程,专为Tessellation开辟了新的着色器,这才让Tes

自由理想的足迹 2751

133.在 Vue3 中使用 OpenLayers 实现画多边形、任意编辑、遮罩与剪切处理功能

《Vue3+OpenLayers实现多边形绘制与区域处理》摘要:本文介绍如何基于Vue3+OpenLayers+ol-ext实现地图多边形交互功能。核心功能包括:鼠标绘制任意多边形、拖动顶点编辑边界、遮罩显示(非选区变红)、选区剪切显示及功能重置。技术方案采用OpenLayers处理地图渲染,ol-ext实现高级遮罩/剪切效果,ElementPlus提供UI控件。该方案适用于城市规划、园区展示等需要区域标记的场景,完整代码展示了从初始化、绘制、编辑到特效处理的全流程实现。

小彭的博客 959

.Net如何使用Web API实现数据交互?

数据模型代表了要交互的数据结构。例如,假设我们要创建一个简单的图书管理系统,我们可以定义一个Book类作为数据模型。set;set;set;

Code365 257

OGL光照

基本概念 光照影响整个场景的氛围,缺少光照还会缺乏三维的感觉。光照主要集中在光源的类型位置方向等参数,光照物体的材质(狭隘的指光照属性)和纹理,采用的光照模型。      OGL镜面高光颜色GL_SEPARATE_SPECULAR_COLOR在纹理处理Fragment 纹理映射后进行, 目的是减少纹理颜色对镜面光颜色的影响。其它类型的光照都是在纹理映射前进行。现在光照都要求在Shader中计算

自由理想的足迹 1416

芯片ATE测试PAT(Part Average Testing)学习总结-20250916

文章摘要:零件平均测试(PAT)是半导体制造中基于统计学的质量控制方法,分为静态和动态两种类型。静态PAT通过预先设定的固定限值(每6-8批次更新)筛选异常芯片,计算采用稳健平均值和四分位间距。动态PAT则根据实时数据调整限值,能更精确识别异常而不误判合格芯片。两种方法均采用"均值±6倍标准差"的计算公式,但动态PAT具有更好的适应性和准确性。该方法通过统计分析提高了芯片产品的质量和可靠性。

歌颂苦难的行为是无耻的; 1190

OGL(教程3)——三角形

原文地址:http://ogldev.atspace.co.uk/www/tutorial03/tutorial03.html 背景知识 这个教程非常的短。我们仅仅是上节的基础上扩展,以用来画一个三角形。 本节我们只依赖于规格化的盒子。可见的顶点必须在盒子内,所以视口变化将他们映射到可见的窗口坐标。如果从-z轴看这个盒子的话,其形状如下所示: (-1.0,-1.0)被映射到窗口的左下角。(-1....

小孔明的专栏 286

高可用架构设计——多节点OpenClaw集群部署与负载均衡(2026企业级)

本文介绍了企业级OpenClaw高可用集群架构设计,重点阐述了多节点部署与负载均衡方案。架构采用分层设计,包括表现层、应用层、数据层和基础设施层,确保99.99%的可用性目标。详细配置了主节点、工作节点和存储节点规格,提供Kubernetes集群部署脚本示例,实现自动化的容器编排管理。通过硬件冗余、故障隔离和弹性扩展等可靠性原则,构建能够应对各种故障场景的稳定AI助手系统。

博客 420

双端之Nginx+Php结合PostgreSQL搭建Wordpress

制作的 PG4WP 分支版本,它与所有版本的 WordPress 兼容,解决了原版的一些问题。参数,确保 PostgreSQL 正在监听默认端口(通常是 5432),或者你自定义的端口。:PG4WP 插件存在缺陷和不完整的功能,可能与最新版本的 WordPress 不兼容。的插件,它允许 WordPress 使用 PostgreSQL 数据库。,如果看到 Nginx 的默认欢迎页面,说明 Nginx 已正确安装。,如果看到 Nginx 的默认欢迎页面,说明 Nginx 已正确安装。

宇宙第一小趴菜的博客 1891

OGL绘制相关函数总结1

一.绘制相关函数 1)glClear** glClearColor,glClearDepth, glClearIndex,glClearStencil,glClearAccum 目的是颜色后台缓存,深度缓存等设置为一个状态,不用每次绘制屏幕的时候都指定颜色。也就是上面的函数只需要init中调用,不需要每次display中调用设置颜色和深度。 每帧display时候需要清理屏幕用glC

自由理想的足迹 5904

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

DirectX12 - Triangle Culling and Winding Order(三角形的剔除与绕序)

我们都知道,在现有的3D图形框架中,3D模型都是由Triangle有序排列起来的。例如一个长方体有6个面,每个面可以拆分成2个Triangle。那么我们就可以用[Tri0…

sunshinebooming的博客 2633

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

OGL(教程39)——Silhouette Detection

原文地址:http://ogldev.atspace.co.uk/www/tutorial39/tutorial39.html

小孔明的专栏 449

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

OGL绘制相关函数总结2

本文主要整理自http://www.aiuxian.com/article/p-1704414.html,感谢作者wangdingqiaoit 传统的图形绘制方法 传统立即模式Immediate Mode绘图,性能低且设置复杂(新版ogl建议丢弃该绘制功能) 每次绘制CPU向GPU传递数据并绘制: //包含头文件 # include # include #pragma comm

自由理想的足迹 3466

OGL(教程31)——PN Triangles Tessellation

原文网址:http://ogldev.atspace.co.uk/www/tutorial31/tutorial31.html

小孔明的专栏 808

OGL(教程9)——差值

原文地址:http://ogldev.atspace.co.uk/www/tutorial10/tutorial10.html

小孔明的专栏 520

用NAppGUI开发3D应用:OpenGL渲染管线与上下文创建入门实战

你是否想过用纯C语言开发一款跨平台的3D桌面应用?NAppGUI正是一个专门为Windows、macOS和Linux打造的开源C SDK,它内置了完整的OpenGL 3D渲染支持模块。本文将以NAppGUI官方示例GLHello为实战蓝本,带你一步步理解OpenGL渲染管线、掌握OpenGL上下文创建的核心流程,让你用最少的代码跑通第一个跨平台3D程序。无论你是C语言爱好者,还是想快速上手桌面3D

gitblog_00916的博客 1071

OGL(教程10)——索引绘制

原文地址:http://ogldev.atspace.co.uk/www/tutorial11/tutorial11.html

小孔明的专栏 299

OGL(教程4)——着色器

原文地址:http://ogldev.atspace.co.uk/www/tutorial04/tutorial04.html 背景知识 从这节教程开始,每一个特效以及我们将要使用的技术都将通过shader来实现。shader是3D图形学现在使用的方法。你也能认为这是一种倒退,因为在固定渲染管线中已经提供了3D的功能,它只需要开发者配置参数(比如灯光的属性、旋转的值等),而使用shader,这些都...

小孔明的专栏 637

OGL(教程36)——延迟渲染2

原文地址:http://ogldev.atspace.co.uk/www/tutorial36/tutorial36.html

小孔明的专栏 405
上一篇: dos copy
下一篇: VAO VBO EBO
不如学也
博客等级 码龄12年 22粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值