干掉那个BUG 2017-07-19 08:42 采纳率: 33.3%
浏览 1109
已采纳

简单的OpenGL问题,大佬们帮一把!

如题,最近在学OpenGL。今天自己写了一个画三角形的程序,但是,出来的结果不对,坐标和我设置的不一样。于是我就试着画了两条垂直的直线,结果还是不对。
具体情况看下图:我想要画(-1,0)(1,0)(0,-1)(0,1)两条直线,结果如下:
图片说明
代码如下:

#include<gl/glfw3.h>
#include<iostream>
#pragma comment(lib,"glfw3.lib")
using namespace std;
void framebuffer_size_callback(GLFWwindow * window,int width,int height);
void processInput(GLFWwindow *window);
//定义顶点着色器
const char *VertexShaderSource = "#version 430 core\n"
"layout(location=0) in vec3 aPos;\n"
"void main()\n"
"{\n"
"gl_Position=vec4(aPos.x,aPos.y,aPos.z,1.0);\n"
"}\n\0";
//定义片元着色器
const char *FragmentShaderSource = "#version 430 core\n"
"out vec4 FragColor;\n"
"void main()\n"
"{\n"
"FragColor=vec4(1.0,0.5,0.2,1.0);"
"}\n\0";
int main()
{
    glfwInit();//初始化GLFW
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3);//配置GLFW:想要配置什么选项:指定OpenGL最低主版本号
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,3);//指定OpenGL最低副版本号
    glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE);//指定使用OpenGL库
    GLFWwindow * window = glfwCreateWindow(600,600,"LearnOpenGL",NULL,NULL);//创建窗口(该函数返回一个GLFWwindow对象)
                                                                            //参数:第一二个参数指定窗口的宽和高,
                                                                            //第三个指定窗口名称。最后两个参数可以忽略
    if (window==NULL)
    {
        cout << "Failed to create GLFW window" << endl;
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        cout << "Failed to initialize GLAD" << endl;
        return -1;
    }
    //初始化顶点着色器
    int vertexShader=glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader,1,&VertexShaderSource,NULL);
    glCompileShader(vertexShader);
    int success;
    char infoLog[512];
    glGetShaderiv(vertexShader,GL_COMPILE_STATUS,&success);
    if (!success)
    {
        glGetShaderInfoLog(vertexShader,512,NULL,infoLog);
        cout << "Failed to compile vertexshader"<<endl;
    }
    //初始化片元着色器
    int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader,1,&FragmentShaderSource,NULL);
    glCompileShader(fragmentShader);
    glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
    if (!success)
    {
        glGetShaderSource(fragmentShader,512,NULL,infoLog);
        cout << "Failed to compile fragment shader" << endl;
    }
    //定义并初始化Shader Programe
    int programe = glCreateProgram();
    glAttachShader(programe,vertexShader);
    glAttachShader(programe,fragmentShader);
    glLinkProgram(programe);
    glGetProgramiv(programe,GL_LINK_STATUS,&success);
    if (!success)
    {
        glGetProgramInfoLog(programe,512,NULL,infoLog);
        cout << "Failed to Link Programe" << endl;
    }
    glValidateProgram(programe);
    glGetProgramiv(programe,GL_VALIDATE_STATUS,&success);
    if (!success)
    {
        glGetProgramInfoLog(programe,512,NULL,infoLog);
        cout<<"Failed to validate programe"<<endl;
    }
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);
    glUseProgram(programe);

    //定义顶点数组
    float vertex[] = 
    {
        -1.0,0.0,
        1.0,0.0,
        0.0,-1.0,
        0.0,1.0
    };
    //定义VBO,VAO
    unsigned int VBO,VAO;
    glGenVertexArrays(1,&VAO);
    glGenBuffers(1,&VBO);
    glBindVertexArray(VAO);
    glBindBuffer(GL_ARRAY_BUFFER,VBO);
    glBufferData(GL_ARRAY_BUFFER,sizeof(vertex),vertex,GL_STATIC_DRAW);
    glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,sizeof(float),(void*)0);
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER,0);
    glBindVertexArray(0);

    glViewport(0,0,600,600);
    glfwSetFramebufferSizeCallback(window,framebuffer_size_callback);    //指定窗口尺寸改变时所使用的回调函数
    while (!glfwWindowShouldClose(window))                              //当我们告知GLFW结束时,在关闭窗口
    {
        processInput(window);
        glClearColor(0.2,0.3,0.3,1.0);
        glClear(GL_COLOR_BUFFER_BIT);
        glUseProgram(programe);
        glBindVertexArray(VAO);
        glDrawArrays(GL_LINES,0,4);

        glfwSwapBuffers(window);
        glfwPollEvents();                                               //检查是否有事件触发(如输入或者鼠标移动操作),然后
                                                                        //更新窗口状态
    }
    glDeleteVertexArrays(1,&VAO);                                       //绘制结束之后销毁所有的VAO与VBO
    glDeleteBuffers(1,&VBO);
    glfwTerminate();
    return 0;
}

void framebuffer_size_callback(GLFWwindow* window,int width,int height)  //改变窗口大小的回调函数
{
    glViewport(0,0,width,height);
}
void processInput(GLFWwindow * window)
{
    if ((glfwGetKey(window,GLFW_KEY_BACKSPACE)==GLFW_PRESS))
    {
        glfwSetWindowShouldClose(window,true);
    }
}

  • 写回答

2条回答 默认 最新

  • 干掉那个BUG 2017-07-19 15:05
    关注

    已解决,此贴终结!我又把代码重新敲了一遍,居然发现一切正常。灵异的很

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 vhdl+MODELSIM
  • ¥20 simulink中怎么使用solve函数?
  • ¥30 dspbuilder中使用signalcompiler时报错Error during compilation: Fitter failed,求解决办法
  • ¥15 gwas 分析-数据质控之过滤稀有突变中出现的问题
  • ¥15 没有注册类 (异常来自 HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
  • ¥15 知识蒸馏实战博客问题
  • ¥15 用PLC设计纸袋糊底机送料系统
  • ¥15 simulink仿真中dtc控制永磁同步电机如何控制开关频率
  • ¥15 用C语言输入方程怎么
  • ¥15 网站显示不安全连接问题