C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 为什么精灵不能在OpenGL中渲染?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图在OpenGL中渲染2D(屏幕协调)精灵.然而,当我编译它时,它没有显示出来.我看到代码很好(甚至没有任何着色器编译错误,也没有任何其他错误).我也设置了矩阵(我怀疑这是导致问题的原因,那就是启动混乱!!)

便说一句,这是源代码(没有调试,简而言之): –

@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;
}

解决方法

@H_489_16@ 您必须初始化模型矩阵变量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

大佬总结

以上是大佬教程为你收集整理的c – 为什么精灵不能在OpenGL中渲染?全部内容,希望文章能够帮你解决c – 为什么精灵不能在OpenGL中渲染?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。