渲染到纹理
来源:互联网 发布:谜画之塔mac版 编辑:程序博客网 时间:2024/05/16 15:20
完整程序
https://github.com/WaldenPonder/opengl-test/tree/master/t003
/* 帧缓冲, 渲染到纹理*/#include "stdafx.h"#include "../common/common.out.h"/*VAO VBO EBO 纹理*/using namespace std;float color1 = 0.1;float color2 = 0.3;float color3 = 0.4;bool g_b_line = false;void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode){ if (key == GLFW_KEY_1) { color1 = float(rand() % 255) / 255.0; } else if (key == GLFW_KEY_2) { color2 = float(rand() % 255) / 255.0; } else if (key == GLFW_KEY_3) { color3 = float(rand() % 255) / 255.0; } else if (key == GLFW_KEY_A) { glm::vec3 axis(0, 0, 1); g_Mat4 = glm::rotate(g_Mat4, 3.0f, axis); } else if (key == GLFW_KEY_B) { glm::vec3 axis(0, 1, 0); g_Mat4 = glm::rotate(g_Mat4, 3.0f, axis); } else if (key == GLFW_KEY_C) { glm::vec3 axis(1, 0, 0); g_Mat4 = glm::rotate(g_Mat4, 3.0f, axis); } else if (key == GLFW_KEY_D) { glm::vec3 axis(1, 0, 0); g_Mat4 = glm::translate(g_Mat4, axis); } else if (key == GLFW_KEY_E) { glm::vec3 axis(0, 1, 0); g_Mat4 = glm::translate(g_Mat4, axis); } else if (key == GLFW_KEY_F) { glm::vec3 axis(0, 0, 1); g_Mat4 = glm::translate(g_Mat4, axis); } else if (key == GLFW_KEY_W && action == 1) { g_b_line = !g_b_line; }}GLfloat quadVertices[] ={ // Positions // TexCoords -1.0f, 1.0f, 0.0f, 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 1.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f};int main(){ GLfloat cubePts[180]; tools::GetCubePts_withTexture(cubePts); glfwInit(); 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); GLFWwindow* window = glfwCreateWindow(1200, 900, "learn opengl", nullptr, nullptr); glfwMakeContextCurrent(window); glewInit(); int w, h; glfwGetFramebufferSize(window, &w, &h); glViewport(0, 0, w, h); glfwSetKeyCallback(window, key_callback); GLuint VAO, VBO; { glGenVertexArrays(1, &VAO); glGenBuffers(1, &VBO); glBindVertexArray(VAO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(cubePts), cubePts, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * FLOAT_SIZE, (void*)0); glEnableVertexAttribArray(0); glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * FLOAT_SIZE, (void*) (3 * FLOAT_SIZE )); glEnableVertexAttribArray(1); glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } GLuint quadVAO, quadVBO; { glGenVertexArrays(1, &quadVAO); glGenBuffers(1, &quadVBO); glBindVertexArray(quadVAO); glBindBuffer(GL_ARRAY_BUFFER, quadVBO); glBufferData(GL_ARRAY_BUFFER, sizeof(quadVertices), quadVertices, GL_STATIC_DRAW); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), (GLvoid*)0); glEnableVertexAttribArray(0); glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), (GLvoid*)(2 * sizeof(GLfloat))); glEnableVertexAttribArray(1); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); } GLuint frambuffer, texColorBuffer; { glGenFramebuffers(1, &frambuffer); glBindFramebuffer(GL_FRAMEBUFFER, frambuffer); glGenTextures(1, &texColorBuffer); glBindTexture(GL_TEXTURE_2D, texColorBuffer); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1200, 900, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glBindTexture(GL_TEXTURE_2D, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texColorBuffer, 0); // 生成一个渲染缓存对象#if 0 GLuint rbo; glGenRenderbuffers(1, &rbo); glBindRenderbuffer(GL_RENDERBUFFER, rbo); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 1200, 900); glBindRenderbuffer(GL_RENDERBUFFER, 0); // 把渲染缓冲对象附加到深度模板附件上 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);#endif if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) cout << "frame buffer uncompleted " << endl; glBindFramebuffer(GL_FRAMEBUFFER, 0); } GLuint texture = tools::CreateTexture("../common/src/container.jpg", GL_REPEAT, GL_LINEAR); Shader shader("vert003.v", "frag003.f"); Shader shaderNew("vert003new.v", "frag003new.f"); g_Mat4 = glm::mat4(1.0); while (!glfwWindowShouldClose(window)) { glfwPollEvents(); //1 glBindFramebuffer(GL_FRAMEBUFFER, frambuffer); glClearColor(color1, color2, color3, 1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); glPolygonMode(GL_FRONT_AND_BACK, g_b_line ? GL_LINE : GL_FILL); glEnable(GL_DEPTH_TEST); //glDepthFunc(GL_ALWAYS); glEnable(GL_CULL_FACE); glFrontFace(GL_CCW); glCullFace(GL_BACK); shader.Use(); shader.setUniformMat4f("vert_mat", g_Mat4); shader.setUniformTexture2D("samp", texture, 0); glBindVertexArray(VAO); glDrawArrays(GL_TRIANGLES, 0, 36); glBindVertexArray(0); //2 glBindFramebuffer(GL_FRAMEBUFFER, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(1, 1, 1, 1); glDisable(GL_DEPTH_TEST); shaderNew.Use(); shaderNew.setUniformTexture2D("sampNew", texColorBuffer, 0); glBindVertexArray(quadVAO); glDrawArrays(GL_TRIANGLES, 0, 6); glBindVertexArray(0); glfwSwapBuffers(window); } glfwTerminate(); return 0;}
阅读全文
0 0
- 渲染到纹理
- Direct3D渲染到纹理
- RTT--渲染到纹理!
- Ogre渲染到纹理
- DirectX-渲染到纹理
- DirectX-渲染到纹理
- 渲染到纹理
- DirectX-渲染到纹理
- OGRE渲染到纹理
- DirectX-渲染到纹理
- OpenGL渲染到纹理
- FBO 渲染到纹理
- DirectX-渲染到纹理
- 渲染到纹理
- 渲染到纹理(转)
- 使用渲染到纹理例子
- OGRE Demo_RenderToTexture 渲染到纹理
- D3D中的渲染到纹理
- 打印菱形图案 / 猴子吃桃问题
- 对于所有对象都通用的方法
- 用lex分析C源码中数据结构关系拓扑图
- 【最爱高傲感伤的英文歌曲之王《Aplogize》 ——《对不起》】
- Android Runtime运行linux命令
- 渲染到纹理
- Python中多线程的阻塞问题
- 利用openssl来计算sha256哈希值
- 日期计算器
- c常用字符串函数
- Triangular, pentagonal, and hexagonal Problem 45
- android binder
- 第四天,加油
- 利用XX-Net 设置Git 代理