"https://open.gl/"教程之Drawing Polygons源码(freeglut版)

VERTEX_SHADER

#version 150 core

in vec2 position;
in vec3 color;

out vec3 Color;
void main(){
    Color=color;
    gl_Position=vec4(position.x,-position.y,0,1);
}

FRAGMENT_SHADER

#version 150 core

out vec4 outColor;
in vec3 Color;

uniform vec3 triangleColor;
void main(){
    //outColor=vec4(triangleColor,1.0);
    outColor=vec4(Color,1.0);
}

源文件:#include"glew.h"

#include<Windows.h>
#include"freeglut.h"
#include<gl\GL.h>
#include<random>
#include"LoadShaders.h"      //使用红宝书8版工具
GLuint vao;
GLuint vbo;
GLuint ebo;
GLuint uniColor;
GLfloat rColor=1.f;
void Init(){
    GLfloat vertices[] = {
        0.0,0.5,    1.f,0.f,0.f,
        0.5,-0.5,    0.f,1.f,0.f,
        -0.5,-0.5,    0.f,0.f,1.f
    };

    GLuint elements[] = { 0, 1, 2 };
    ShaderInfo shaders[] = {
        {GL_VERTEX_SHADER,"vertexShader.txt"},
        {GL_FRAGMENT_SHADER,"fragementShader.txt"},
        {GL_NONE,NULL}
    };
    GLuint shaderProgram = LoadShaders(shaders);
    //**VAO开始记录
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
    //*VBO
    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    //*EBO
    glGenBuffers(1, &ebo);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW);
    //*数据配接
    glUseProgram(shaderProgram);

    GLuint posAttri = glGetAttribLocation(shaderProgram, "position");
    glVertexAttribPointer(posAttri, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GL_FLOAT), 0);
    glEnableVertexAttribArray(posAttri);
    GLuint colorAttri = glGetAttribLocation(shaderProgram, "color");
    glVertexAttribPointer(colorAttri, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GL_FLOAT), (void*)(2 * sizeof(GL_FLOAT)));
    glEnableVertexAttribArray(colorAttri);
    uniColor = glGetUniformLocation(shaderProgram, "triangleColor");
    glUniform3f(uniColor, 1.f, 0.f, 0.f);

    glClearColor(0, 0, 0, 1);
}
void Display(){
    glClear(GL_COLOR_BUFFER_BIT);
    glBindVertexArray(vao);
    glUniform3f(uniColor, rColor, 0.f, 0.f);
    //glDrawArrays(GL_TRIANGLES, 0, 3);
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);
    glFlush();
}
//作者使用定时改变颜色,这里利用键盘、随机数改变颜色
void KeyboardFunc(unsigned char key,int x,int y){
    static std::default_random_engine dre;
    static std::uniform_int_distribution<int> di(1, 100);
    switch (key)
    {
    case ‘c‘:
        rColor = std::abs(std::sin((double)di(dre)));
        glutPostRedisplay();
        break;
    default:
        break;
    }
}
int main(int argc,char** argv){
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_RGBA);
    glutInitWindowSize(512, 512);
    glutInitWindowPosition(100, 200);
    glutInitContextVersion(3, 2);
    glutInitContextProfile(GLUT_CORE_PROFILE);
    glutCreateWindow(argv[0]);
    glewExperimental = true;
    glewInit();
    Init();
    glutDisplayFunc(Display);
    glutKeyboardFunc(KeyboardFunc);
    glutMainLoop();
    return 0;
}
时间: 2024-10-29 19:08:20

"https://open.gl/"教程之Drawing Polygons源码(freeglut版)的相关文章

&quot;https://open.gl/&quot;教程之Textures源码(freeglut版)

VERTEX_SHADER: #version 150 core in vec2 position; in vec3 color; in vec2 texcoord; out vec3 Color; out vec2 TexCoord; void main(){ Color=color; TexCoord=texcoord; gl_Position=vec4(position,0,1); } FRAGMENT_SHADER: #version 150 core in vec3 Color; in

Exchanger源码Android版剖析

Exchanger是一个针对线程可以结对交换元素的同步器.每条线程把某个对象作为参数调用exchange方法,与伙伴线程进行匹配,然后再函数返回的时接收伙伴的对象.另外,Exchanger内部实现采用的是无锁算法,能够大大提高多线程竞争下的吞吐量以及性能. 算法实现 基本方法是维持一个"槽"(slot),这个槽是保持交换对象的结点的引用,同时也是一个等待填满的"洞"(hole).如果一个即将到来的"占领"(occupying)线程发现槽为空,然后

缅甸华纳娱乐 缅甸华纳国际15687949443 小刀娱乐网源码2019版特色功能介绍

想必缅甸华纳娱乐 缅甸华纳国际15687949443 小刀娱乐网源码2019版特色功能介绍,详情请见下文: 1.按钮功用: 按钮色彩分为两种,一种是蓝色,一种是赤色.蓝色按钮是添加.修正之类较为安全,不会形成数据丢失的功用.赤色按钮是删去.恢复之类若误操作会形成数据丢失的功用,故按钮使用色彩区别及配合对话框提示会最大程度确保操作精确性. 2.单行文本框: 当填写完表单时,将光标定位在单行文本框中敲击回车键,可替代点击提交表单按钮的功用.此功用可便利用户快速提交表单. 3.复选框与单选框: 在选中

CountDownLatch &amp; CyclicBarrier源码Android版实现解析

CountDownLatch CountDownLatch允许一条或者多条线程等待直至其它线程完成以系列的操作的辅助同步器. 用一个指定的count值对CountDownLatch进行初始化.await方法会阻塞,直至因为调用countDown方法把当前的count降为0,在这以后,所有的等待线程会被释放,并且在这以后的await调用将会立即返回.这是一个一次性行为--count不能被重置.如果你需要一个可以重置count的版本,考虑使用CyclicBarrier. 其实本类实现非常简单,和Re

飞行熊猫游戏源码android版

这款游戏是前一段时间完成的一个项目,飞行熊猫游戏源码android版,飞行熊猫基于cocos2d游戏引擎开发,包括了谷歌admob广告支持,没有任何版权问题,大家可以自由修改和上传应用商店. 1.本游戏支持无限关卡. 2.源码包也包括了游戏PSD格式资源文件,可自行修改图片. 3.自适应各种屏幕分辨率, 支持android2.1+ 源码下载: http://code.662p.com/view/6682.html <ignore_js_op> <ignore_js_op> <

麦当劳优惠券客户端应用源码完美版

麦当劳优惠券客户端应用源码完美版,该源码比较完整的,基本实现了常用的点餐订餐的功能了,大家可以参考一下吧. 应用说明: 能省钱的必备软件,占用资源少,起码可装个备用. *可直接使用,不需要打印,非常方便* 选好你需要的套餐,向柜台服务员展示即可 全国麦当劳通用.上海.广州.张家口.绵阳.青岛.深圳. 天津.北京.武.汕头.宝鸡.南京.呼和浩特.四川泸州.山西太原,以上城市已有热心网友验证可用电子券杭州.厦门麦当劳亲测可用 <ignore_js_op> 133302589.jpg (59.39

Java并发编程之StampedLock锁源码探究

StampedLock是JUC并发包里面JDK1.8版本新增的一个锁,该锁提供了三种模式的读写控制,当调用获取锁的系列函数的时候,会返回一个long 型的变量,该变量被称为戳记(stamp),这个戳记代表了锁的状态. try系列获取锁的函数,当获取锁失败后会返回为0的stamp值.当调用释放锁和转换锁的方法时候需要传入获取锁时候返回的stamp值. StampedLockd的内部实现是基于CLH锁的,CLH锁原理:锁维护着一个等待线程队列,所有申请锁且失败的线程都记录在队列.一个节点代表一个线程

Java并发编程之CAS二源码追根溯源

在上一篇文章中,我们知道了什么是CAS以及CAS的执行流程,在本篇文章中,我们将跟着源码一步一步的查看CAS最底层实现原理. 本篇是<凯哥(凯哥Java:kagejava)并发编程学习>系列之<CAS系列>教程的第二篇:从源码追根溯源查看CAS最底层是怎么实现的. 本文主要内容:CAS追根溯源,彻底找到CAS的根在哪里. 一:查看AtomicInteger.compareAndSet源码 通过上一篇文章学习,我们知道了AtomicInteger.compareAndSet方法不加锁

教你如何剖析源码

一.源码阅读需求 在学习中,我们会需要了解,学习,使用一个框架,一个新的函数库.在工作中,因为业务需求,因为性能问题,可能通过一个更高性能的工具,架构去优化我们的程序. 那么,问题就来了.网站下载了源码,目录一层一层,头文件无数,打开之后又是一个函数上百行代码,一个类可能有近千行代码.看着都崩溃了,只想关机去静静. 那么,现在.就谈谈如何阅读源码的问题了. 二.源码阅读方法 认知过程: ①了解库/框架的功能-->具体做法:找到相关文档或者书籍,获取库/框架的功能简介.知道他是干什么的.(相关知识