OpenGL学习——变换——绕x轴来回旋转的木板
学习OpenGL的变换。
Local Space => World Space => View Space => Clip Space => Screen Space
ModelMatrix
ViewMatrix
ProjectionMatrix : Orthographic Perspective
GLM: OpenGL Mathematics
变换效果:

初始化与渲染代码:
RectFall.h
#ifndef RectFall_h
#define RectFall_h
#include "RectBox.h"
class RectFall : public RectBox
{
public:
RectFall();
~RectFall();
protected:
virtual void init();
virtual void draw();
private:
GLuint _textureOne;
GLuint _textureTwo;
};
#endif // !RectFall_hRectFall.cpp
#include "RectFall.h"
RectFall::RectFall(){
}
RectFall::~RectFall(){
}
void RectFall::init(){
// x,y,z opengl coordinates, the vertex data, three 3d point in normalized device coordinates
GLfloat vertexs[] = {
//position color texture coordinates
0.3f, -0.2f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, // right up
0.3f, -0.9f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, // right down
-0.3f, -0.2f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, // left up
-0.3f, -0.9f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, // left down
};
// vertex draw index array
GLuint indexs[] = {
0, 1, 2,
1, 2, 3,
};
//define VAO, vertex array object
glGenVertexArrays(1, &_VAO);
glBindVertexArray(_VAO); // bind vertex array object
//define VBO, vertex buffer object
GLuint VBO;
glGenBuffers(1, &VBO); // gen buffer object
glBindBuffer(GL_ARRAY_BUFFER, VBO); // bind buffer to the target
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexs), vertexs, GL_STATIC_DRAW); // copy vertex data to VBO
//define EBO, element buffer object
GLuint EBO;
glGenBuffers(1, &EBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexs), indexs, GL_STATIC_DRAW);
//set vertex attribute point
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
glEnableVertexAttribArray(1);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat)));
glEnableVertexAttribArray(2);
glBindVertexArray(0);//unbind vertex array object
//create shader program
const GLchar* vsPath = "res/rectfall.vs";
const GLchar* fragPath = "res/rectfall.frag";
this->_shader = new Shader(vsPath, fragPath);
//gen texture about
this->genTexture(_textureOne, "res/container.jpg");
this->genTexture(_textureTwo, "res/awesomeface.png");
}
void RectFall::draw(){
//use shader programs
this->_shader->useProgram();
//set uniform value
GLfloat curTime = glfwGetTime(); // current time
GLfloat uniMixRate = (cos(2 * curTime) + 1.0f) / 2.0f;
glUniform1f(_shader->getUniformLocation("uniMixRate"), uniMixRate);
//set uniform, the transform
glm::float32 curRotate = glm::radians(-64.0f * curTime);
curRotate = uniMixRate * glm::radians(360.0f);
glm::mat4 modelMatrix(1.0f);
modelMatrix = glm::translate(modelMatrix, glm::vec3(0.0f, -0.55f, 0.0f));
modelMatrix = glm::rotate(modelMatrix, curRotate, glm::vec3(1.0f, 0.0f, 0.0f));
modelMatrix = glm::translate(modelMatrix, glm::vec3(0.0f, 0.55f, 0.0f));
glm::mat4 viewMatrix(1.0f);
viewMatrix = glm::translate(viewMatrix, glm::vec3(0.0f, 0.0f, -2.5f));
glm::mat4 projectionMatrix(1.0f);
projectionMatrix = glm::perspective(glm::radians(45.0f), 16.0f/9.0f, 0.1f, 100.0f);
glUniformMatrix4fv(_shader->getUniformLocation("modelMatrix"), 1, GL_FALSE, glm::value_ptr(modelMatrix));
glUniformMatrix4fv(_shader->getUniformLocation("viewMatrix"), 1, GL_FALSE, glm::value_ptr(viewMatrix));
glUniformMatrix4fv(_shader->getUniformLocation("projectionMatrix"), 1, GL_FALSE, glm::value_ptr(projectionMatrix));
//bind texture
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, _textureOne);
glUniform1i(_shader->getUniformLocation("textureOne"), 0);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, _textureTwo);
glUniform1i(_shader->getUniformLocation("textureTwo"), 1);
//draw the Rectangles
glBindVertexArray(_VAO);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); // GL_LINE GL_FILL set the wireframe mode
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
}
加载纹理方法:
void RectBox::genTexture(GLuint &texture, const char *filename){
std::cout << "filename = " << filename << std::endl;
//gen texture
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
//set wrapping
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
//set filter
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//load image
int width, height;
unsigned char* image = SOIL_load_image(filename, &width, &height, 0, SOIL_LOAD_RGBA);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
glGenerateMipmap(GL_TEXTURE_2D);
//free image
SOIL_free_image_data(image);
glBindTexture(GL_TEXTURE_2D, 0);
}着色器代码:
rectfall.vs
#version 330 core
layout (location = 0) in vec3 v_pos;
layout (location = 1) in vec3 v_color;
layout (location = 2) in vec2 v_textureCoord;
out vec4 f_vertexColor;
out vec2 f_textureCoord;
uniform mat4 modelMatrix;
uniform mat4 viewMatrix;
uniform mat4 projectionMatrix;
void main () {
gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(v_pos, 1.0);
f_vertexColor = vec4(v_color, 1.0f);
f_textureCoord = v_textureCoord;
}rectfall.frag
#version 330 core
in vec4 f_vertexColor;
in vec2 f_textureCoord;
out vec4 color;
uniform float uniMixRate;
uniform sampler2D textureOne;
uniform sampler2D textureTwo;
void main () {
vec4 boxColor = texture(textureOne, f_textureCoord);
vec4 faceColor = texture(textureTwo, vec2(f_textureCoord.x, 1.0f - f_textureCoord.y));
float mixRate = uniMixRate;
if(mixRate > 0.3f){
mixRate = 0.3f;
}
color = mix(boxColor, faceColor, mixRate);
} 相关推荐
夕加加 2020-07-20
shsshs 2020-06-13
夕加加 2020-06-13
图形学与可视化 2020-06-11
shsshs 2020-05-05
alexazh 2020-05-03
夕加加 2020-04-23
sxaudq0 2020-04-14
qiangbizhi 2020-04-09
alexazh 2020-03-06
sxaudq0 2020-02-23
夕加加 2020-02-15
sxaudq0 2020-01-18
夕加加 2020-01-06
shsshs 2019-12-05
dayenglish 2013-07-12
sxaudq0 2019-11-12