OpenGL을 처음 접했고 여러 자습서를 읽고 있는데 개체를 렌더링하는 데 사용되는 여러 가지 방법이 있다는 것을 알았지 만 여전히 그 차이점과 각 기능을 사용할 때 차이점이 있습니까?OpenGL : 다중 렌더링 방법 .. 언제 사용합니까?
예를 들어,이 큐브를 렌더링하기 위해 셰이더를 사용하는이 example을 따르고 있으며 "정상적인"방법으로 렌더링하려했을 때 - 이것이 올바른 표현 인 경우. 아무것도 렌더링되지 않습니다. 난 항상 shaderProgram.setAttributeArray()
, shaderProgram.enableAttributeArray()
및 shaderProgram.disableAttributeArray()
를 호출해야하지만 그것은 바로 다른 방법을 사용하여 렌더링을 시도하는 경우 - 다시,이 glBegin()
및 glEnd()
를 사용하여 올바른 expression- 경우. 아무것도 내가 그것을 사용해야 할 때, 난 정말 이해가 안 나는 또 다른 질문 쉐이더 개념 자체를 가지고, 또한
작동되지 않고해야하지 여기
내 예를 때 :#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();
}
고마워요. 많은 것들을 깨끗하게합니다. – fujy
하지만 마지막 질문에서 정확히 어떤 사람이 VertexBufferObject와 VertexArrayObject를 사용합니까? – fujy
또한이 예제는'glDrawArrays (GL_TRIANGLES, 0, vertices.size());'호출을 사용하여 삼각형을 렌더링하는 방법을 보여줍니다. 그러나'Normals'와 같이 렌더링하고 싶다면 어떻게해야합니까?'shaders '모드? .. 즉,'glNormal3d()'호출의 대안은 무엇입니까? – fujy