您的位置:首页 > 理论基础 > 计算机网络

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

2016-05-06 11:19 435 查看
以上一节Textures代码为基础,没变的部分用灰色表示。

VERTEX_SHADER:

#version 150 core

in vec2 position;
in vec3 color;
in vec2 texcoord;

out vec3 Color;
out vec2 TexCoord;

uniform mat4 trans;
uniform mat4 view;
uniform mat4 project;
void main(){
Color=color;
TexCoord=texcoord;
//gl_Position=trans*vec4(position,0,1);
//只设置view,没设置project什么都看不大
//gl_Position=view*trans*vec4(position,0,1);
gl_Position=project*view*trans*vec4(position,0,1);
}


FRAGEMENT_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"

#include"glm\glm.hpp"
#include"glm\gtc\matrix_transform.hpp"
#include"glm\gtc\type_ptr.hpp"
GLuint vao;
GLuint vbo;
GLuint ebo;
GLuint tbo[2];
//translate
GLuint uniTransLoc;
glm::mat4 trans;        //初始化一个单位矩阵

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);
//**translation
//trans = glm::rotate(trans, glm::radians(5.f), glm::vec3(0.0f, 0.f, 1.f));
uniTransLoc = glGetUniformLocation(shaderProgram, "trans");
glUniformMatrix4fv(uniTransLoc, 1, GL_FALSE, glm::value_ptr(trans));
//*view 默认eye(0.f,0.f,0.f),center(0.f,0.f,-1.f),up(0.f,1.f,0.f)
glm::mat4 view=glm::lookAt(glm::vec3(1.2f, 1.2f, 1.2f), glm::vec3(0.f, 0.f, 0.f), glm::vec3(0.f, 0.f, 1.f));
GLuint uniViewLoc = glGetUniformLocation(shaderProgram, "view");
glUniformMatrix4fv(uniViewLoc, 1, GL_FALSE, glm::value_ptr(view));
//*project 3D中一定要设置投影,否则看不到
glm::mat4 project = glm::perspective(glm::radians(45.f), 1.f, 1.f, 100.f);
GLuint uniProjectLoc = glGetUniformLocation(shaderProgram, "project");
glUniformMatrix4fv(uniProjectLoc, 1, GL_FALSE, glm::value_ptr(project));

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();
}
void KeyboardFunc(unsigned char c, int x, int){
switch (c)
{
case 'x':
case 'X':
trans = glm::rotate(trans, glm::radians(5.f), glm::vec3(1.f, 0.f, 0.f));
case 'y':
case 'Y':
trans = glm::rotate(trans, glm::radians(5.f), glm::vec3(0.f, 1.f, 0.f));
case 'z':
case 'Z':
trans = glm::rotate(trans, glm::radians(5.f), glm::vec3(0.f, 0.f, 1.f));
default:
break;
}
glUniformMatrix4fv(uniTransLoc, 1, GL_FALSE, glm::value_ptr(trans));
glutPostRedisplay();
}
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: