大佬教程收集整理的这篇文章主要介绍了c – 为什么精灵不能在OpenGL中渲染?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_868_5@main.cpp中
// Including all required headers here... #include <iostream> #define GLEW_STATIC #include <GL/glew.h> #include <GLFW/glfw3.h> #include "SOIL2/SOIL2.h" #include <glm/glm.hpp> #include <glm/gtc/type_ptr.hpp> #include <glm/gtc/matrix_transform.hpp> const GLchar * vertexShadersource = "#version 330 core\n" "layout(LOCATIOn = 0) in vec4 vertex;\n" "out vec2 TexCoords;\n" "uniform mat4 model;\n" "uniform mat4 projection;\n" "void main()\n" "{\n" "TexCoords = vertex.zw;\n" "gl_Position = projection * model * vec4(vertex.xy,0.0,1.0);\n" "}\0"; const GLchar * fragmentShadersource = "#version 330 core\n" "in vec2 TexCoords;\n" "out vec4 color;\n" "uniform sampler2D image;\n" "uniform vec3 spriteColor;\n" "void main()\n" "{\n" "color = vec4(spriteColor,1.0) * texture(image,TexCoords);\n" "}\0"; const GLint WIDTH = 800,HEIGHT = 600; int main() { glfwInit(); glfwWindowHint(GLFW_COntexT_VERSION_MAJOR,3); glfwWindowHint(GLFW_COntexT_VERSION_MINOR,3); glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GLFW_falSE); glfwWindowHint(GLFW_RESIZABLE,GL_falSE); GLFWwindow *window = glfwCreateWindow(WIDTH,HEIGHT,"Rendering Sprites",nullptr,nullptr); int screenWidth,screenHeight; glfwGetFramebufferSize(window,&screenWidth,&screenHeight); glfwMakeContextCurrent(window); glewExperimental = GL_TRUE; glewInit(); glViewport(0,screenWidth,screenHeight); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); glShadersource(vertexShader,1,&vertexShadersource,null); glCompileShader(vertexShader); GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShadersource(fragmentShader,&fragmentShadersource,null); glCompileShader(fragmentShader); GLuint shaderProgram = glCreateProgram(); glAttachShader(shaderProgram,vertexShader); glAttachShader(shaderProgram,fragmentShader); glLinkProgram(shaderProgram); gl@R_607_9421@eShader(vertexShader); gl@R_607_9421@eShader(fragmentShader); GLuint quadVAO; GLuint VBO; GLfloat vertices[] = { 0.0f,1.0f,0.0f,0.0f }; glGenVertexArrays(1,&quadVAO); glGenBuffers(1,&VBO); glBindBuffer(GL_ARRAY_BUFFER,VBO); glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW); glBindVertexArray(quadVAO); glEnabLevertexAttribArray(0); glVertexAttribPointer(0,4,GL_FLOAT,GL_falSE,4 * sizeof(GLfloat),(GLvoid*)0); glBindBuffer(GL_ARRAY_BUFFER,0); glBindVertexArray(0); GLuint texture; int width,height; glGentextures(1,&texturE); glBindTexture(GL_TEXTURE_2D,texturE); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); unsigned char *image = SOIL_load_image("img.png",&width,&height,SOIL_LOAD_RGBA); glTexImage2D(GL_TEXTURE_2D,GL_RGBA,width,height,GL_UNSIGNED_BYTE,imagE); SOIL_free_image_data(imagE); glBindTexture(GL_TEXTURE_2D,0); while (!glfwWindowShouldClose(window)) { glfwPollEvents(); glClearColor(0.2f,0.3f,1.0f); glClear(GL_COLOR_BUFFER_BIT); glUseProgram(shaderProgram); glm::mat4 model; glm::mat4 projection = glm::ortho(0.0f,static_cast<GLfloat>(WIDTH),static_cast<GLfloat>(HEIGHT),-1.0f,1.0f); glm::vec2 size = glm::vec2(10.0f,10.0f); glm::vec2 position = glm::vec2(-10.0f,10.0f); glm::vec3 color = glm::vec3(1.0f,0.0f); GLfloat rotation = 0.0f; model = glm::translate(model,glm::vec3(position,0.0f)); model = glm::translate(model,glm::vec3(0.5f * size.x,0.5f * size.y,0.0f)); model = glm::rotate(model,rotation,glm::vec3(0.0f,1.0f)); model = glm::translate(model,glm::vec3(-0.5f * size.x,-0.5f * size.y,0.0f)); model = glm::scale(model,glm::vec3(size,1.0f)); glUniformMatrix4fv(glGetUniformLOCATIOn(shaderProgram,"projection"),glm::value_ptr(projection)); glUniformMatrix4fv(glGetUniformLOCATIOn(shaderProgram,"model"),glm::value_ptr(model)); glUniform3f(glGetUniformLOCATIOn(shaderProgram,"spriteColor"),color.x,color.y,color.z); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D,texturE); glBindVertexArray(quadVAO); glDrawArrays(GL_TRIANGLES,6); glBindVertexArray(0); glfwSwapBuffers(window); } gl@R_607_9421@eVertexArrays(1,&quadVAO); gl@R_607_9421@eBuffers(1,&VBO); glfwTerminate(); return EXIT_succesS; }
glm API documentation指的是The OpenGL Shading Language specification 4.20.
这意味着,可以通过单个参数1.0初始化单位矩阵:
glm::mat4 model(1.0f);
此外,您的精灵非常小,它在左侧的视口(剪辑空间)之外:
glm::vec2 position = glm::vec2(10.0f,10.0f); // 10.0f instead of -10.0f
以上是大佬教程为你收集整理的c – 为什么精灵不能在OpenGL中渲染?全部内容,希望文章能够帮你解决c – 为什么精灵不能在OpenGL中渲染?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。