"https://open.gl/"教程之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 vec2 TexCoord;

out vec4 outColor;

uniform sampler2D texKit;
uniform sampler2D texPupy;

uniform vec3 triangleColor;
void main(){
    //outColor=texture(texKit,TexCoord)*vec4(Color,1.0);
    vec4 colKit=texture(texKit,TexCoord);
    vec4 colPupy=texture(texPupy,TexCoord);
    outColor=mix(colKit,colPupy,0.2);
}

源码:

#include"glew.h"
#include<Windows.h>
#include"freeglut.h"
#include<gl\GL.h>
#include<random>
#include"LoadShaders.h"
#include"SOIL.h"
GLuint vao;
GLuint vbo;
GLuint ebo;
GLuint tbo[2];

void Init(){
    GLfloat vertices[] = {
        -0.5,0.5,    1.0,0.0,0.0,    0.0,0.0,
        0.5,0.5,    0.0,1.0,0.0,    1.0,0.0,
        0.5,-0.5,    0.0,0.0,1.0,    1.0,1.0,
        -0.5,-0.5,    1.0,1.0,1.0,    0.0,1.0

    };

    GLuint elements[] = { 0, 1, 2,2,3,0 };
    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);

    //*数据配接
    glUseProgram(shaderProgram);

    GLuint posAttri = glGetAttribLocation(shaderProgram, "position");
    glVertexAttribPointer(posAttri, 2, GL_FLOAT, GL_FALSE, 7 * sizeof(GL_FLOAT), 0);
    glEnableVertexAttribArray(posAttri);

    GLuint colorAttri = glGetAttribLocation(shaderProgram, "color");
    glVertexAttribPointer(colorAttri, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(GL_FLOAT), (void*)(2 * sizeof(GL_FLOAT)));
    glEnableVertexAttribArray(colorAttri);

    GLuint texAttri = glGetAttribLocation(shaderProgram, "texcoord");
    glVertexAttribPointer(texAttri, 2, GL_FLOAT, GL_FALSE, 7 * sizeof(GL_FLOAT), (void*)(5*sizeof(GL_FLOAT)));
    glEnableVertexAttribArray(texAttri);

    //*EBO
    glGenBuffers(1, &ebo);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW);
    //*TBO
    glGenTextures(2, tbo);
    int width = 0, height = 0;
    unsigned char* image;

    glActiveTexture(GL_TEXTURE0);        //对应samplerD texKit
    glBindTexture(GL_TEXTURE_2D, tbo[0]);
        image=SOIL_load_image("sample.png", &width, &height, 0, SOIL_LOAD_RGB);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
        SOIL_free_image_data(image);
    glUniform1i(glGetUniformLocation(shaderProgram,"texKit"), 0);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glActiveTexture(GL_TEXTURE1);        //对应samplerD texPupy
    glBindTexture(GL_TEXTURE_2D, tbo[1]);
        image = SOIL_load_image("sample2.png", &width, &height, 0, SOIL_LOAD_RGB);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
        SOIL_free_image_data(image);
    glUniform1i(glGetUniformLocation(shaderProgram, "texPupy"), 1);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glClearColor(0, 0, 0, 1);
}
void Display(){
    glClear(GL_COLOR_BUFFER_BIT);
    glBindVertexArray(vao);
    //glDrawArrays(GL_TRIANGLES, 0, 3);
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
    //glDrawElementsBaseVertex(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0, 1);
    glFlush();
}

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);
    glutMainLoop();
    return 0;
}
时间: 2024-08-10 19:33:25

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

&quot;https://open.gl/&quot;教程之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;

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并发编程之ReentrantLock源码分析

ReentrantLock介绍 从JDK1.5之前,我们都是使用synchronized关键字来对代码块加锁,在JDK1.5引入了ReentrantLock锁.synchronized关键字性能比ReentrantLock锁要差,而且ReentrantLock锁功能要比synchronized关键字功能强大. 特点 synchronized关键字和ReentrantLock锁都是重入锁,可重入锁是指当一个线程获取到锁后,此线程还可继续获得这把锁,在此线程释放这把锁前其他线程则不可获得这边锁.相比

Java并发编程之CountDownLatch源码解析

一.导语 最近在学习并发编程原理,所以准备整理一下自己学到的知识,先写一篇CountDownLatch的源码分析,之后希望可以慢慢写完整个并发编程. 二.什么是CountDownLatch CountDownLatch是java的JUC并发包里的一个工具类,可以理解为一个倒计时器,主要是用来控制多个线程之间的通信.比如有一个主线程A,它要等待其他4个子线程执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了. 三.简单使用 public static void mai

一步步教你如何源码编译Recovery

*1 准备Ubuntu作为您的操作系统,笔者的版本是12.04_amd64. *2 准备 Android 源码的编译环境,主要是安装一些编译用到的lib库,以及同步源码的一些工具 ,如GIT,CURL,REPO等.[source.android.com] *3 在确保环境已准备妥当之后,接下来开始下载 Android 源码,此文以cm 10.1  源码为例. 1).创建一个用于存放源码的目录,如:android/system mkdir –p android/system 2).切换到该目录 c