opengl中如何对图像多次模糊

来源:互联网 发布:apache 2.4 模式切换 编辑:程序博客网 时间:2024/06/05 04:37

效果图


对图像的多次模糊关键在于fbo的使用

opengl中fbo的创建

#pragma once#include "glew.h"#include <map>#include <stack>class FBO{public:GLuint mFBO;std::map<std::string, GLuint> mBuffers;std::stack<GLenum> mDrawBuffers;public:FBO();void AttachColorBuffer(const char*bufferName,GLenum attachment,GLenum dataType,int width,int height);void AttachDepthBuffer(const char*bufferName, int width, int height);void Finish();void Bind();void Unbind();GLuint GetBuffer(const char*bufferName);};
#include "FBO.h"FBO::FBO(){glGenFramebuffers(1, &mFBO);}void FBO::AttachColorBuffer(const char*bufferName, GLenum attachment, GLenum dataType, int width, int height){GLuint colorBuffer;glBindFramebuffer(GL_FRAMEBUFFER, mFBO);glGenTextures(1, &colorBuffer);glBindTexture(GL_TEXTURE_2D, colorBuffer);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexImage2D(GL_TEXTURE_2D, 0, dataType, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);glBindTexture(GL_TEXTURE_2D, 0);glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_2D, colorBuffer, 0);mDrawBuffers.push(attachment);mBuffers.insert(std::pair<std::string,GLuint>(bufferName,colorBuffer));glBindFramebuffer(GL_FRAMEBUFFER, 0);}void FBO::AttachDepthBuffer(const char*bufferName, int width, int height){GLuint depthMap;glBindFramebuffer(GL_FRAMEBUFFER, mFBO);glGenTextures(1, &depthMap);glBindTexture(GL_TEXTURE_2D, depthMap);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);glBindTexture(GL_TEXTURE_2D, 0);glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthMap, 0);mBuffers.insert(std::pair<std::string, GLuint>(bufferName, depthMap));glBindFramebuffer(GL_FRAMEBUFFER, 0);}void FBO::Finish(){int nCount = (int)mDrawBuffers.size();if (nCount>0){GLenum *buffers = new GLenum[nCount];int i = 0;while (!mDrawBuffers.empty()){buffers[i++] = mDrawBuffers.top();mDrawBuffers.pop();}glBindFramebuffer(GL_FRAMEBUFFER, mFBO);glDrawBuffers(nCount, buffers);glBindFramebuffer(GL_FRAMEBUFFER, 0);}}void FBO::Bind(){glBindFramebuffer(GL_FRAMEBUFFER, mFBO);}void FBO::Unbind(){glBindFramebuffer(GL_FRAMEBUFFER, 0);}GLuint FBO::GetBuffer(const char*bufferName){auto iter = mBuffers.find(bufferName);if (iter!=mBuffers.end()){return iter->second;}return 0;}

如何实现多次模糊

#include <windows.h>#include "glew.h"#include <stdio.h>#include <math.h>#include "utils.h"#include "GPUProgram.h"#include "ObjModel.h"#include "FBO.h"#include "FullScreenQuad.h"#include "Glm/glm.hpp"#include "Glm/ext.hpp"#pragma comment(lib,"opengl32.lib")#pragma comment(lib,"glew32.lib")LRESULT CALLBACK GLWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){switch (msg){case WM_CLOSE:PostQuitMessage(0);break;}return DefWindowProc(hwnd,msg,wParam,lParam);}INT WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd){WNDCLASSEX wndClass;wndClass.cbClsExtra = 0;wndClass.cbSize = sizeof(WNDCLASSEX);wndClass.cbWndExtra = 0;wndClass.hbrBackground = NULL;wndClass.hCursor = LoadCursor(NULL,IDC_ARROW);wndClass.hIcon = NULL;wndClass.hIconSm = NULL;wndClass.hInstance = hInstance;wndClass.lpfnWndProc=GLWindowProc;wndClass.lpszClassName = L"OpenGL";wndClass.lpszMenuName = NULL;wndClass.style = CS_VREDRAW | CS_HREDRAW;ATOM atom = RegisterClassEx(&wndClass);RECT rect;rect.left = 0;rect.top = 0;rect.right = 1280;rect.bottom = 720;AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, FALSE);HWND hwnd = CreateWindowEx(NULL, L"OpenGL", L"RenderWindow", WS_OVERLAPPEDWINDOW, 100, 100, rect.right-rect.left, rect.bottom-rect.top, NULL, NULL, hInstance, NULL);HDC dc = GetDC(hwnd);PIXELFORMATDESCRIPTOR pfd;memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));pfd.nVersion = 1;pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_TYPE_RGBA | PFD_DOUBLEBUFFER;pfd.iLayerType = PFD_MAIN_PLANE;pfd.iPixelType = PFD_TYPE_RGBA;pfd.cColorBits = 32;pfd.cDepthBits = 24;pfd.cStencilBits = 8;int pixelFormatID = ChoosePixelFormat(dc, &pfd);SetPixelFormat(dc,pixelFormatID,&pfd);HGLRC rc = wglCreateContext(dc);wglMakeCurrent(dc, rc);GetClientRect(hwnd, &rect);int viewportWidth = rect.right - rect.left, viewportHeight = rect.bottom - rect.top;glewInit();//多屏渲染shader GPUProgram originalProgram;originalProgram.AttachShader(GL_VERTEX_SHADER, "Debug/res/shader/fullscreenquad.vs");originalProgram.AttachShader(GL_FRAGMENT_SHADER, "Debug/res/shader/fullscreenquad.fs");originalProgram.Link();originalProgram.DetectAttribute("pos");originalProgram.DetectAttribute("texcoord");originalProgram.DetectUniform("U_MainTexture");//腐蚀图像shaderGPUProgram erosionProgram;erosionProgram.AttachShader(GL_VERTEX_SHADER, "Debug/res/shader/fullscreenquad.vs");erosionProgram.AttachShader(GL_FRAGMENT_SHADER, "Debug/res/shader/Erosion.fs");erosionProgram.Link();erosionProgram.DetectAttribute("pos");erosionProgram.DetectAttribute("texcoord");erosionProgram.DetectUniform("U_MainTexture");//膨胀图像shaderGPUProgram dilationProgram;dilationProgram.AttachShader(GL_VERTEX_SHADER, "Debug/res/shader/fullscreenquad.vs");dilationProgram.AttachShader(GL_FRAGMENT_SHADER, "Debug/res/shader/Dilation.fs");dilationProgram.Link();dilationProgram.DetectAttribute("pos");dilationProgram.DetectAttribute("texcoord");dilationProgram.DetectUniform("U_MainTexture");//高斯模糊shaderGPUProgram gaussianProgram;gaussianProgram.AttachShader(GL_VERTEX_SHADER, "Debug/res/shader/fullscreenquad.vs");gaussianProgram.AttachShader(GL_FRAGMENT_SHADER, "Debug/res/shader/Gaussian.fs");gaussianProgram.Link();gaussianProgram.DetectAttribute("pos");gaussianProgram.DetectAttribute("texcoord");gaussianProgram.DetectUniform("U_MainTexture");//光照shaderGPUProgram gpuProgram;gpuProgram.AttachShader(GL_VERTEX_SHADER, "Debug/res/shader/Light.vs");gpuProgram.AttachShader(GL_FRAGMENT_SHADER, "Debug/res/shader/Light.fs");gpuProgram.Link();gpuProgram.DetectAttribute("pos");gpuProgram.DetectAttribute("texcoord");gpuProgram.DetectAttribute("normal");gpuProgram.DetectUniform("M");gpuProgram.DetectUniform("V");gpuProgram.DetectUniform("P");gpuProgram.DetectUniform("NM");gpuProgram.DetectUniform("U_AmbientLightColor");gpuProgram.DetectUniform("U_AmbientMaterial");gpuProgram.DetectUniform("U_DiffuseLightColor");gpuProgram.DetectUniform("U_DiffuseMaterial");gpuProgram.DetectUniform("U_SpecularLightColor");gpuProgram.DetectUniform("U_SpecularMaterial");gpuProgram.DetectUniform("U_LightPos");gpuProgram.DetectUniform("U_EyePos");gpuProgram.DetectUniform("U_LightDirection");gpuProgram.DetectUniform("U_Cutoff");gpuProgram.DetectUniform("U_DiffuseIntensity");//init 3d modelObjModel cube;cube.Init("Debug/res/model/Cube.obj");float identity[] = {1.0f,0,0,0,0,1.0f,0,0,0,0,1.0f,0,0,0,0,1.0f};float ambientLightColor[] = { 0.4f,0.4f,0.4f,1.0f };//环境光颜色float ambientMaterial[] = { 0.2f,0.2f,0.2f,1.0f };//环境光材质float diffuseLightColor[] = { 1.0f,1.0f,1.0f,1.0f };//漫反射光颜色float diffuseMaterial[] = { 0.6f,0.6f,0.6f,1.0f };//漫反射光材质float diffuseIntensity = 1.0f;//漫反射光照强度float specularLightColor[] = { 1.0f,1.0f,1.0f,1.0f };//镜面光颜色float specularMaterial[] = { 1.0f,1.0f,1.0f,1.0f };//镜面光材质float lightPos[] = { 0.0f,1.5f,0.0f,0.0f };// 光源位置float spotLightDirection[] = { 0.0f,-1.0f,0.0f,128.0f };//聚光灯中心线方向float spotLightCutoff = 0.0f;// 聚光灯中心线和入射光线的最大夹角float eyePos[] = { 0.0f,0.0f,0.0f };//眼睛的位置//glm::mat4 model3 = glm::translate<float>(6.0f, 0.0f, -6.0f)*glm::rotate(-30.0f, 0.0f, 0.0f, 1.0f);//glm::mat4 normalMatrix3 = glm::inverseTranspose(model3);glm::mat4 projectionMatrix = glm::perspective(50.0f, (float)viewportWidth / (float)viewportHeight, 0.1f, 1000.0f);glm::mat4 viewMatrix3 = glm::lookAt(glm::vec3(7.0f, 1.5f, -3.0f), glm::vec3(6.0f, 0.0f, -6.0f), glm::vec3(0.0f, 1.0f, 0.0f));FullScreenQuad fsq;fsq.Init();FBO fbo;fbo.AttachColorBuffer("color", GL_COLOR_ATTACHMENT0, GL_RGBA, viewportWidth, viewportHeight);fbo.AttachDepthBuffer("depth", viewportWidth, viewportHeight);fbo.Finish();FBO fbo2;fbo2.AttachColorBuffer("color", GL_COLOR_ATTACHMENT0, GL_RGBA, viewportWidth, viewportHeight);fbo2.AttachDepthBuffer("depth", viewportWidth, viewportHeight);fbo2.Finish();FBO fbo3;fbo3.AttachColorBuffer("color", GL_COLOR_ATTACHMENT0, GL_RGBA, viewportWidth, viewportHeight);fbo3.AttachDepthBuffer("depth", viewportWidth, viewportHeight);fbo3.Finish();ShowWindow(hwnd, SW_SHOW);UpdateWindow(hwnd);glClearColor(0.0f, 0.0f, 0.0f, 1.0f);glEnable(GL_DEPTH_TEST);MSG msg;float rotate = 1.0f;while (true){if (PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE)){if (msg.message==WM_QUIT){break;}TranslateMessage(&msg);DispatchMessage(&msg);}rotate += 0.3;glm::mat4 model3 = glm::translate<float>(6.0f, 0.0f, -6.0f)*glm::rotate(rotate, 1.0f,0.0f, 0.0f);glm::mat4 normalMatrix3 = glm::inverseTranspose(model3);//渲染到fbo//将原始模型绘制到fbofbo.Bind();glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glUseProgram(gpuProgram.mProgram);glUniformMatrix4fv(gpuProgram.GetLocation("P"), 1, GL_FALSE, glm::value_ptr(projectionMatrix));glUniform4fv(gpuProgram.GetLocation("U_AmbientLightColor"), 1, ambientLightColor);glUniform4fv(gpuProgram.GetLocation("U_AmbientMaterial"), 1, ambientMaterial);glUniform4fv(gpuProgram.GetLocation("U_DiffuseLightColor"), 1, diffuseLightColor);glUniform4fv(gpuProgram.GetLocation("U_DiffuseMaterial"), 1, diffuseMaterial);glUniform4fv(gpuProgram.GetLocation("U_SpecularLightColor"), 1, specularLightColor);glUniform4fv(gpuProgram.GetLocation("U_SpecularMaterial"), 1, specularMaterial);glUniform3fv(gpuProgram.GetLocation("U_EyePos"), 1, eyePos);glUniform4fv(gpuProgram.GetLocation("U_LightDirection"), 1, spotLightDirection);glUniform1f(gpuProgram.GetLocation("U_DiffuseIntensity"), diffuseIntensity);//spot lightlightPos[0] = 6.3f;lightPos[1] = 3.0f;lightPos[2] = -5.8f;lightPos[3] = 1.0f;diffuseIntensity = 4.0f;spotLightCutoff = 15.0f;//degreeglUniform4fv(gpuProgram.GetLocation("U_LightPos"), 1, lightPos);glUniform1f(gpuProgram.GetLocation("U_DiffuseIntensity"), diffuseIntensity);glUniform1f(gpuProgram.GetLocation("U_Cutoff"), spotLightCutoff);glUniformMatrix4fv(gpuProgram.GetLocation("M"), 1, GL_FALSE, glm::value_ptr(model3));glUniformMatrix4fv(gpuProgram.GetLocation("V"), 1, GL_FALSE, glm::value_ptr(viewMatrix3));glUniformMatrix4fv(gpuProgram.GetLocation("NM"), 1, GL_FALSE, glm::value_ptr(normalMatrix3));cube.Bind(gpuProgram.GetLocation("pos"), gpuProgram.GetLocation("texcoord"), gpuProgram.GetLocation("normal"));cube.Draw();fbo.Unbind();//blur x1--第一次模糊  将fbo作为fbo2的纹理 ,切换shader,绘制到fbo2中  fbo2.Bind();glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glUseProgram(gaussianProgram.mProgram);glBindTexture(GL_TEXTURE_2D, fbo.GetBuffer("color"));glUniform1i(gaussianProgram.GetLocation("U_MainTexture"), 0);//绘制到屏幕正中间fsq.Draw(gaussianProgram.GetLocation("pos"), gaussianProgram.GetLocation("texcoord"));fbo2.Unbind();//blur x2--第二次模糊  将fbo2作为fbo3的纹理  ,切换shader,绘制到fbo3中 fbo3.Bind();glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glUseProgram(gaussianProgram.mProgram);glBindTexture(GL_TEXTURE_2D, fbo2.GetBuffer("color"));glUniform1i(gaussianProgram.GetLocation("U_MainTexture"), 0);//绘制到屏幕正中间fsq.Draw(gaussianProgram.GetLocation("pos"), gaussianProgram.GetLocation("texcoord"));fbo3.Unbind();//-------将fbo中的内容绘制到屏幕上glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//将未模糊的原图绘制到屏幕左上角glUseProgram(originalProgram.mProgram);glActiveTexture(GL_TEXTURE0);glBindTexture(GL_TEXTURE_2D, fbo.GetBuffer("color"));glUniform1i(originalProgram.GetLocation("U_MainTexture"), 0);fsq.DrawToLeftTop(originalProgram.GetLocation("pos"), originalProgram.GetLocation("texcoord"));//将第一次模糊后的结果绘制到屏幕右上角glUseProgram(gaussianProgram.mProgram);glBindTexture(GL_TEXTURE_2D, fbo.GetBuffer("color"));glUniform1i(gaussianProgram.GetLocation("U_MainTexture"), 0);fsq.DrawToRightTop(erosionProgram.GetLocation("pos"), erosionProgram.GetLocation("texcoord"));//就第二次模糊后的结果绘制到屏幕左下角glBindTexture(GL_TEXTURE_2D, fbo2.GetBuffer("color"));glUniform1i(gaussianProgram.GetLocation("U_MainTexture"), 0);fsq.DrawToLeftBottom(dilationProgram.GetLocation("pos"), dilationProgram.GetLocation("texcoord"));//将第三次模糊后的结果绘制到屏幕右下角glBindTexture(GL_TEXTURE_2D, fbo3.GetBuffer("color"));glUniform1i(gaussianProgram.GetLocation("U_MainTexture"), 0);fsq.DrawToRightBottom(gaussianProgram.GetLocation("pos"), gaussianProgram.GetLocation("texcoord"));glFlush();SwapBuffers(dc);}return 0;}

如何实现多屏渲染

#include "FullScreenQuad.h"void FullScreenQuad::Init(){glGenBuffers(1, &mVBO);glBindBuffer(GL_ARRAY_BUFFER, mVBO);glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 20, nullptr, GL_STATIC_DRAW);glBindBuffer(GL_ARRAY_BUFFER, 0);}//绘制充满屏幕的四边形void FullScreenQuad::Draw(GLint posLoc, GLint texcoordLoc){//draw fullscreenfloat vertices[] = {-0.5f,-0.5f,-1.0f,0.0f,0.0f,0.5f,-0.5f,-1.0f,1.0f,0.0f,0.5f,0.5f,-1.0f,1.0f,1.0f,-0.5f,0.5f,-1.0f,0.0f,1.0f};glBindBuffer(GL_ARRAY_BUFFER, mVBO);glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 20, vertices, GL_STATIC_DRAW);glBindBuffer(GL_ARRAY_BUFFER, 0);glBindBuffer(GL_ARRAY_BUFFER, mVBO);glEnableVertexAttribArray(posLoc);glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 5, 0);glEnableVertexAttribArray(texcoordLoc);glVertexAttribPointer(texcoordLoc, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 5, (void*)(sizeof(float)*3));glDrawArrays(GL_QUADS, 0, 4);glBindBuffer(GL_ARRAY_BUFFER, 0);}void FullScreenQuad::DrawToLeftTop(GLint posLoc, GLint texcoordLoc){//draw to left top qualter of screenfloat vertices[] = {-0.5f,0.0f,-1.0f,0.0f,0.0f,0.0f,0.0f,-1.0f,1.0f,0.0f,0.0f,0.5f,-1.0f,1.0f,1.0f,-0.5f,0.5f,-1.0f,0.0f,1.0f};//创建vbo并将顶点数据上传至vboglBindBuffer(GL_ARRAY_BUFFER, mVBO);glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 20, vertices, GL_STATIC_DRAW);glBindBuffer(GL_ARRAY_BUFFER, 0);//绑定vbo并启用顶点相关属性,且指定各个属性在vbo中的起始位置和偏移量glBindBuffer(GL_ARRAY_BUFFER, mVBO);glEnableVertexAttribArray(posLoc);glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 5, 0);glEnableVertexAttribArray(texcoordLoc);glVertexAttribPointer(texcoordLoc, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 5, (void*)(sizeof(float) * 3));glDrawArrays(GL_QUADS, 0, 4);glBindBuffer(GL_ARRAY_BUFFER, 0);}void FullScreenQuad::DrawToLeftBottom(GLint posLoc, GLint texcoordLoc){float vertices[] = {-0.5f,-0.5f,-1.0f,0.0f,0.0f,0.0f,-0.5f,-1.0f,1.0f,0.0f,0.0f,0.0f,-1.0f,1.0f,1.0f,-0.5f,0.0f,-1.0f,0.0f,1.0f};glBindBuffer(GL_ARRAY_BUFFER, mVBO);glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 20, vertices, GL_STATIC_DRAW);glBindBuffer(GL_ARRAY_BUFFER, 0);glBindBuffer(GL_ARRAY_BUFFER, mVBO);glEnableVertexAttribArray(posLoc);glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 5, 0);glEnableVertexAttribArray(texcoordLoc);glVertexAttribPointer(texcoordLoc, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 5, (void*)(sizeof(float) * 3));glDrawArrays(GL_QUADS, 0, 4);glBindBuffer(GL_ARRAY_BUFFER, 0);}void FullScreenQuad::DrawToRightTop(GLint posLoc, GLint texcoordLoc){float vertices[] = {0.0f,-0.0f,-1.0f,0.0f,0.0f,0.5f,-0.0f,-1.0f,1.0f,0.0f,0.5f,0.5f,-1.0f,1.0f,1.0f,0.0f,0.5f,-1.0f,0.0f,1.0f};glBindBuffer(GL_ARRAY_BUFFER, mVBO);glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 20, vertices, GL_STATIC_DRAW);glBindBuffer(GL_ARRAY_BUFFER, 0);glBindBuffer(GL_ARRAY_BUFFER, mVBO);glEnableVertexAttribArray(posLoc);glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 5, 0);glEnableVertexAttribArray(texcoordLoc);glVertexAttribPointer(texcoordLoc, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 5, (void*)(sizeof(float) * 3));glDrawArrays(GL_QUADS, 0, 4);glBindBuffer(GL_ARRAY_BUFFER, 0);}void FullScreenQuad::DrawToRightBottom(GLint posLoc, GLint texcoordLoc){float vertices[] = {0.0f,-0.5f,-1.0f,0.0f,0.0f,0.5f,-0.5f,-1.0f,1.0f,0.0f,0.5f,0.0f,-1.0f,1.0f,1.0f,0.0f,0.0f,-1.0f,0.0f,1.0f};glBindBuffer(GL_ARRAY_BUFFER, mVBO);glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 20, vertices, GL_STATIC_DRAW);glBindBuffer(GL_ARRAY_BUFFER, 0);glBindBuffer(GL_ARRAY_BUFFER, mVBO);glEnableVertexAttribArray(posLoc);glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 5, 0);glEnableVertexAttribArray(texcoordLoc);glVertexAttribPointer(texcoordLoc, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 5, (void*)(sizeof(float) * 3));glDrawArrays(GL_QUADS, 0, 4);glBindBuffer(GL_ARRAY_BUFFER, 0);}



阅读全文
0 0