Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL:多种渲染方法。。什么时候用哪个?_C++_Opengl_Qtopengl - Fatal编程技术网

C++ OpenGL:多种渲染方法。。什么时候用哪个?

C++ OpenGL:多种渲染方法。。什么时候用哪个?,c++,opengl,qtopengl,C++,Opengl,Qtopengl,我是OpenGL新手,我正在学习多个教程,我注意到有多种方法可用于渲染对象,但我仍然不知道它们之间的区别以及何时使用它们 例如。。我遵循这一点,使用着色器渲染立方体,当我尝试使用“正常”方式渲染立方体时-如果这是一个正确的表达式。没有任何东西被渲染。我总是需要调用shaderProgram.setAttributeArray(),shaderProgram.enableAttributeArray()和shaderProgram.disableAttributeArray() 但是,如果我尝试直

我是OpenGL新手,我正在学习多个教程,我注意到有多种方法可用于渲染对象,但我仍然不知道它们之间的区别以及何时使用它们

例如。。我遵循这一点,使用着色器渲染立方体,当我尝试使用“正常”方式渲染立方体时-如果这是一个正确的表达式。没有任何东西被渲染。我总是需要调用
shaderProgram.setAttributeArray()
shaderProgram.enableAttributeArray()
shaderProgram.disableAttributeArray()

但是,如果我尝试直接使用另一种方式渲染它-同样,如果这是一个正确的表达式-使用
glBegin()
glEnd()
。什么都没用

另外,我还有一个问题,着色器概念本身,我真的不明白什么时候应该使用它,什么时候不应该

以下是我的例子:

#include "glwidget.h"

GlWidget::GlWidget(QWidget *parent)
    : QGLWidget(QGLFormat(/* Additional format options */), parent)
{
    alpha = 25;
    beta = -25;
    distance = 2.5;
}

void GlWidget::initializeGL()
{
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);

    qglClearColor(QColor(Qt::white));

    shaderProgram.addShaderFromSourceFile(QGLShader::Vertex, ":/vertexShader.vsh");
    shaderProgram.addShaderFromSourceFile(QGLShader::Fragment, ":/fragmentShader.fsh");
    shaderProgram.link();

    vertices << QVector3D(-0.5, -0.5,  0.5) << QVector3D( 0.5, -0.5,  0.5) << QVector3D( 0.5,  0.5,  0.5) // Front
             << QVector3D( 0.5,  0.5,  0.5) << QVector3D(-0.5,  0.5,  0.5) << QVector3D(-0.5, -0.5,  0.5)
             << QVector3D( 0.5, -0.5, -0.5) << QVector3D(-0.5, -0.5, -0.5) << QVector3D(-0.5,  0.5, -0.5) // Back
             << QVector3D(-0.5,  0.5, -0.5) << QVector3D( 0.5,  0.5, -0.5) << QVector3D( 0.5, -0.5, -0.5)
             << QVector3D(-0.5, -0.5, -0.5) << QVector3D(-0.5, -0.5,  0.5) << QVector3D(-0.5,  0.5,  0.5) // Left
             << QVector3D(-0.5,  0.5,  0.5) << QVector3D(-0.5,  0.5, -0.5) << QVector3D(-0.5, -0.5, -0.5)
             << QVector3D( 0.5, -0.5,  0.5) << QVector3D( 0.5, -0.5, -0.5) << QVector3D( 0.5,  0.5, -0.5) // Right
             << QVector3D( 0.5,  0.5, -0.5) << QVector3D( 0.5,  0.5,  0.5) << QVector3D( 0.5, -0.5,  0.5)
             << QVector3D(-0.5,  0.5,  0.5) << QVector3D( 0.5,  0.5,  0.5) << QVector3D( 0.5,  0.5, -0.5) // Top
             << QVector3D( 0.5,  0.5, -0.5) << QVector3D(-0.5,  0.5, -0.5) << QVector3D(-0.5,  0.5,  0.5)
             << QVector3D(-0.5, -0.5, -0.5) << QVector3D( 0.5, -0.5, -0.5) << QVector3D( 0.5, -0.5,  0.5) // Bottom
             << QVector3D( 0.5, -0.5,  0.5) << QVector3D(-0.5, -0.5,  0.5) << QVector3D(-0.5, -0.5, -0.5);
}

void GlWidget::resizeGL(int width, int height)
{
    if (height == 0) {
        height = 1;
    }

    pMatrix.setToIdentity();
    pMatrix.perspective(60.0, (float) width / (float) height, 0.001, 1000);

    glViewport(0, 0, width, height);
}

void GlWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    QMatrix4x4 mMatrix;
    QMatrix4x4 vMatrix;

    QMatrix4x4 cameraTransformation;
    cameraTransformation.rotate(alpha, 0, 1, 0);
    cameraTransformation.rotate(beta, 1, 0, 0);

    QVector3D cameraPosition = cameraTransformation * QVector3D(0, 0, distance);
    QVector3D cameraUpDirection = cameraTransformation * QVector3D(0, 1, 0);

    vMatrix.lookAt(cameraPosition, QVector3D(0, 0, 0), cameraUpDirection);

    shaderProgram.bind();
    shaderProgram.setUniformValue("mvpMatrix", pMatrix * vMatrix * mMatrix);

    // This code is able to draw the cube
    shaderProgram.setAttributeArray("vertex", vertices.constData());
    shaderProgram.enableAttributeArray("vertex");
    glDrawArrays(GL_TRIANGLES, 0, vertices.size());
    shaderProgram.disableAttributeArray("vertex");
    // end

    // This code is never able to draw the cube or anything
    glBegin(GL_TRIANGLES);
    for (int var = 0; var < vertices.size(); ++var) {
        glVertex3f(vertices[var][0],vertices[var][1],vertices[var][2]);
    }
    glEnd();
    // end

    shaderProgram.release();
}
#包括“glwidget.h”
GlWidget::GlWidget(QWidget*父项)
:QGLWidget(QGLFormat(/*其他格式选项*/),父级)
{
α=25;
β=-25;
距离=2.5;
}
void GlWidget::initializeGL()
{
glEnable(GLU深度试验);
glEnable(GL_CULL_面);
qglClearColor(QColor(Qt::白色));
shaderProgram.addShaderFromSourceFile(QGLShader::Vertex,:/vertexShader.vsh”);
shaderProgram.addShaderFromSourceFile(QGLShader::Fragment,:/fragmentShader.fsh);
shaderProgram.link();

顶点OpenGL过去有所谓的“”。在其中,可以使用
glBegin()
glEnd()
并在它们之间指定数据(点、法线、纹理坐标)一点一点。你会在每一帧上都这样做,显然这是非常慢的。这个功能早就被弃用了,但大多数图形卡驱动程序仍然支持它,这样就不会破坏现有的软件。但是,如果你想学习现代OpenGL,我会忽略任何有
glBegin()的教程
在其中。今天,您可以一次性将数据传输到GPU(转换为一种称为的格式),然后使用一个命令(使用

你的另一个问题是关于着色器。同样,在过去,OpenGL有一个。这意味着你只提供顶点(法线,…)数据和图形卡继续工作并完成它的任务。您无法修改它对数据的处理方式。在现代世界,管道的某些部分是可编程的,这意味着您可以更改管道的某些部分的操作(通过提供您自己的程序-)。这是非常有用的,因为有许多效果是不可能实现的。同样,如果您不提供自己的着色器,出于兼容性原因,图形卡通常会退回到默认实现中。但您一定要编写自己的着色器(基本着色器仅几行)

总而言之,如果您开始学习现代OpenGL(VBOs、VAOs、着色器),可能需要更长的时间来完成基础知识,但如果您开始学习遗留知识,总有一天您将不得不离开它,重新开始学习现代OpenGL


编辑:混合使用现代代码和传统代码通常不是一个好主意。您可能会让它工作起来,但它不值得这么做。

OpenGL过去有所谓的“”。在其中,您可以使用
glBegin()
glEnd()
并在它们之间指定数据(点、法线、纹理坐标)一点一点。你会在每一帧上都这样做,显然这是非常慢的。这个功能早就被弃用了,但大多数图形卡驱动程序仍然支持它,这样就不会破坏现有的软件。但是,如果你想学习现代OpenGL,我会忽略任何有
glBegin()的教程
在其中。今天,您可以一次性将数据传输到GPU(转换为一种称为的格式),然后使用一个命令(使用

你的另一个问题是关于着色器。同样,在过去,OpenGL有一个。这意味着你只提供顶点(法线,…)数据和图形卡继续工作并完成它的任务。您无法修改它对数据的处理方式。在现代世界,管道的某些部分是可编程的,这意味着您可以更改管道的某些部分的操作(通过提供您自己的程序-)。这是非常有用的,因为有许多效果是不可能实现的。同样,如果您不提供自己的着色器,出于兼容性原因,图形卡通常会退回到默认实现中。但您一定要编写自己的着色器(基本着色器仅几行)

总而言之,如果您开始学习现代OpenGL(VBOs、VAOs、着色器),可能需要更长的时间来完成基础知识,但如果您开始学习遗留知识,总有一天您将不得不离开它,重新开始学习现代OpenGL


编辑:混合使用现代代码和传统代码通常不是一个好主意。您可能会让它工作起来,但它不值得这么做。

OpenGL过去有所谓的“”。在其中,您可以使用
glBegin()
glEnd()
并在它们之间指定数据(点、法线、纹理坐标)一点一点。你会在每一帧上都这样做,显然这是非常慢的。这个功能早就被弃用了,但大多数图形卡驱动程序仍然支持它,这样就不会破坏现有的软件。但是,如果你想学习现代OpenGL,我会忽略任何有
glBegin()的教程
在其中。今天,您可以一次性将数据传输到GPU(转换为一种称为的格式),然后使用一个命令(使用

你的另一个问题是关于着色器。同样,在过去,OpenGL有一个。这意味着你只提供顶点(法线,…)数据,图形卡继续工作。你不能修改它对数据的处理。在现代世界,管道的某些部分是可编程的,这意味着