c – 为什么精灵不能在OpenGL中渲染?
我试图在OpenGL中渲染2D(屏幕协调)精灵.然而,当我编译它时,它没有显示出来.我看到代码很好(甚至没有任何着色器编译错误,也没有任何其他错误).我也设置了矩阵(我怀疑这是导致问题的原因,那就是启动混乱!!)
顺便说一句,这是源代码(没有调试,简而言之): – 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 coren" "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" "} "; const GLchar * fragmentShaderSource = "#version 330 coren" "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" "} "; 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); glDeleteShader(vertexShader); glDeleteShader(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); } glDeleteVertexArrays(1,&quadVAO); glDeleteBuffers(1,&VBO); glfwTerminate(); return EXIT_SUCCESS; } 解决方法
您必须初始化模型矩阵变量glm :: mat4模型.
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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |