首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在屏幕上绘制正方形(相同的宽度和高度)

无法在屏幕上绘制正方形(相同的宽度和高度)
EN

Stack Overflow用户
提问于 2019-05-21 15:30:49
回答 1查看 199关注 0票数 3

我不能画一个高度和宽度相同的物体。我本来想做一些更复杂的事情,但我已经尽可能地把它分解了:

我有一个分辨率为600x600px的窗口和以下顶点和片段着色器:

顶点着色器

代码语言:javascript
复制
#version 330 core

layout (location = 0) in vec3 aPos;
void main()
{
    gl_Position =  vec4(aPos, 1.0f);
}

片段着色器

代码语言:javascript
复制
#version 330 core
out vec4 FragColor;
void main()
    {
        FragColor = vec4(1.0f,1.0f,1.0f,1.0f);
    }

我收到的输出如下:

下面是我用来绘制正方形的代码:

代码语言:javascript
复制
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include "shader.h"
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#include "Object.h"

int width = 600;
int height = 600;

int main()
{
//window creation -----------------------------------------------------------
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_SAMPLES, 16);
    GLFWwindow* window = glfwCreateWindow(width, height, "Mumel", NULL, NULL);

    glfwMakeContextCurrent(window);

    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        std::cout << "Error during GLAD initialization" << std::endl;
        glfwTerminate();
        return -1;
    }

    glViewport(0, 0, width, height);
//----------------------------------------------------------------------
    Shader sh("./shader/vShader.vSh", "./shader/fShader.fSh");

    Circle * circle = new Circle(0.5); //is explained later in the post

    while (!glfwWindowShouldClose(window))
    {
        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        sh.use();
        circle->draw();

        glfwSwapBuffers(window);
        glfwPollEvents();
    }
}

最后但并非最不重要的是,我的“循环”(它应该是一个循环,但是一个方块更易于调试)是由以下代码创建的:

代码语言:javascript
复制
#ifndef OBJECT_H
#define OBJECT_H

#include <glad/glad.h>
#include <iostream>
#include "shader.h"
#include <vector>


class Circle
{
public:
    static const int size = 6; 

    Circle()
    {
        std::vector<float> vertexData(3 * size); 
        // center 
        vertexData.at(0) = 0.0f;
        vertexData.at(1) = 0.0f;
        vertexData.at(2) = 0.0f;

        vertexData.at(3) = 0.5f;
        vertexData.at(5) = 0.0f;
        vertexData.at(4) = -0.5f;

        vertexData.at(6) = -0.5f;
        vertexData.at(8) = 0.0f;
        vertexData.at(7) = -0.5f;

        vertexData.at(9) = -0.5f;
        vertexData.at(11) = 0.0f;
        vertexData.at(10) = 0.5f;

        vertexData.at(12) = 0.5f;
        vertexData.at(14) = 0.0f;
        vertexData.at(13) = 0.5f;

        vertexData.at(15) = 0.5f;
        vertexData.at(17) = 0.0f;
        vertexData.at(16) = -0.5f;


        glGenBuffers(1, &VBO);
        glGenVertexArrays(1, &VAO);
        glBindVertexArray(VAO);

        float * dataArr = vertexData.data(); //The GLSL shader needs a C Array, this returns the pointer to the first array object used by std::vector
        int dataSize = vertexData.size();

        glBindBuffer(GL_ARRAY_BUFFER, VBO);
        glBufferData(GL_ARRAY_BUFFER, dataSize * sizeof(float), dataArr, GL_STATIC_DRAW);

        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
        glEnableVertexAttribArray(0);

        glBindVertexArray(0);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
    }

    void draw()
    {
        glBindVertexArray(VAO);
        glDrawArrays(GL_TRIANGLE_FAN, 0, 3 * (size - 2));
        glBindVertexArray(0);
    }
private:
    unsigned int VBO, VAO;

};

#endif
EN

回答 1

Stack Overflow用户

发布于 2019-05-21 16:15:08

对我来说很好:

系统/构建信息:

  • Windows 10
  • GLFW 3.3
  • 监视器设置为1920x1200
  • 100% GUI缩放

代码:

代码语言:javascript
复制
#include <glad/glad.h>
#define GLFW_INCLUDE_NONE
#include <GLFW/glfw3.h>
#include <glm/glm.hpp>
#include <vector>
#include <iostream>

void CheckStatus( GLuint obj, bool isShader )
{
    GLint status = GL_FALSE, log[ 1 << 11 ] = { 0 };
    ( isShader ? glGetShaderiv : glGetProgramiv )( obj, isShader ? GL_COMPILE_STATUS : GL_LINK_STATUS, &status );
    if( status == GL_TRUE ) return;
    ( isShader ? glGetShaderInfoLog : glGetProgramInfoLog )( obj, sizeof( log ), NULL, (GLchar*)log );
    std::cerr << (GLchar*)log << "\n";
    std::exit( EXIT_FAILURE );
}

void AttachShader( GLuint program, GLenum type, const char* src )
{
    GLuint shader = glCreateShader( type );
    glShaderSource( shader, 1, &src, NULL );
    glCompileShader( shader );
    CheckStatus( shader, true );
    glAttachShader( program, shader );
    glDeleteShader( shader );
}

const char* const vert = 1 + R"GLSL(
#version 330 core
layout (location = 0) in vec3 aPos;
void main()
{
    gl_Position =  vec4(aPos, 1.0f);
}
)GLSL";

const char* const frag = 1 + R"GLSL(
#version 330 core
out vec4 FragColor;
void main()
{
    FragColor = vec4(1.0f,1.0f,1.0f,1.0f);
}
)GLSL";

class Circle
{
public:
    static const int size = 6; 

    Circle()
    {
        std::vector<float> vertexData(3 * size); 
        // center 
        vertexData.at(0) = 0.0f;
        vertexData.at(1) = 0.0f;
        vertexData.at(2) = 0.0f;

        vertexData.at(3) = 0.5f;
        vertexData.at(5) = 0.0f;
        vertexData.at(4) = -0.5f;

        vertexData.at(6) = -0.5f;
        vertexData.at(8) = 0.0f;
        vertexData.at(7) = -0.5f;

        vertexData.at(9) = -0.5f;
        vertexData.at(11) = 0.0f;
        vertexData.at(10) = 0.5f;

        vertexData.at(12) = 0.5f;
        vertexData.at(14) = 0.0f;
        vertexData.at(13) = 0.5f;

        vertexData.at(15) = 0.5f;
        vertexData.at(17) = 0.0f;
        vertexData.at(16) = -0.5f;

        glGenBuffers(1, &VBO);
        glGenVertexArrays(1, &VAO);
        glBindVertexArray(VAO);

        float * dataArr = vertexData.data(); //The GLSL shader needs a C Array, this returns the pointer to the first array object used by std::vector
        int dataSize = vertexData.size();

        glBindBuffer(GL_ARRAY_BUFFER, VBO);
        glBufferData(GL_ARRAY_BUFFER, dataSize * sizeof(float), dataArr, GL_STATIC_DRAW);

        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
        glEnableVertexAttribArray(0);

        glBindVertexArray(0);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
    }

    void draw()
    {
        glBindVertexArray(VAO);
        glDrawArrays(GL_TRIANGLE_FAN, 0, 3 * (size - 2));
        glBindVertexArray(0);
    }

private:
    unsigned int VBO, VAO;
};

int main( int, char** )
{
    glfwSetErrorCallback( []( int, const char* desc ) { std::cerr << desc << "\n"; std::exit( EXIT_FAILURE ); } );
    glfwInit();
    glfwWindowHint( GLFW_CONTEXT_VERSION_MAJOR, 3 );
    glfwWindowHint( GLFW_CONTEXT_VERSION_MINOR, 3 );
    glfwWindowHint( GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE );
    glfwWindowHint( GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE );
    GLFWwindow* window = glfwCreateWindow( 600, 600, "GLFW", NULL, NULL );
    glfwMakeContextCurrent( window );
    gladLoadGLLoader( (GLADloadproc)glfwGetProcAddress );

    Circle * circle = new Circle();

    GLuint prog = glCreateProgram();
    AttachShader( prog, GL_VERTEX_SHADER, vert );
    AttachShader( prog, GL_FRAGMENT_SHADER, frag );
    glLinkProgram( prog );
    CheckStatus( prog, false );
    glUseProgram( prog );

    while( !glfwWindowShouldClose( window ) )
    {
        glfwPollEvents();

        int w, h;
        glfwGetFramebufferSize( window, &w, &h );
        glViewport( 0, 0, w, h );

        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

        circle->draw();

        glfwSwapBuffers( window );
    }

    glfwTerminate();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56241690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档