我正在尝试通过qt-project提供的教程来学习OpenGL。 我需要编写一个可以在Windows和Mac上运行的应用程序。但是我可能会对它们给出的示例有一个问题:当使用glext.h库时,它们指定操作系统是Windows(WIN32的东西)。现在我不确定他们的例子可以在Mac上运行。他们甚至在教程中说:
"glActiveTexture() and GL_TEXTUREi can then be used on Windows."
这是他们的代码:
#include "glwidget.h"
#include <QMouseEvent>
#include <QWheelEvent>
//! [0]
#ifdef WIN32
#include <GL/glext.h>
PFNGLACTIVETEXTUREPROC pGlActiveTexture = NULL;
#define glActiveTexture pGlActiveTexture
#endif //WIN32
//! [0]
GlWidget::GlWidget(QWidget *parent)
: QGLWidget(QGLFormat(/* Additional format options */), parent)
{
alpha = 25;
beta = -25;
distance = 2.5;
}
GlWidget::~GlWidget()
{
}
QSize GlWidget::sizeHint() const
{
return QSize(640, 480);
}
//! [1]
void GlWidget::initializeGL()
{
//! [1]
//! [2]
#ifdef WIN32
glActiveTexture = (PFNGLACTIVETEXTUREPROC) wglGetProcAddress((LPCSTR) "glActiveTexture");
#endif
//! [2]
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
qglClearColor(QColor(Qt::black));
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);
//! [3]
textureCoordinates << QVector2D(0, 0) << QVector2D(.5, 0) << QVector2D(.5, .5) // Front
<< QVector2D(.5, .5) << QVector2D(0, .5) << QVector2D(0, 0)
<< QVector2D(0, 0) << QVector2D(1, 0) << QVector2D(1, 1) // Back
<< QVector2D(1, 1) << QVector2D(0, 1) << QVector2D(0, 0)
<< QVector2D(0, 0) << QVector2D(1, 0) << QVector2D(1, 1) // Left
<< QVector2D(1, 1) << QVector2D(0, 1) << QVector2D(0, 0)
<< QVector2D(0, 0) << QVector2D(1, 0) << QVector2D(1, 1) // Right
<< QVector2D(1, 1) << QVector2D(0, 1) << QVector2D(0, 0)
<< QVector2D(0, 0) << QVector2D(1, 0) << QVector2D(1, 1) // Top
<< QVector2D(1, 1) << QVector2D(0, 1) << QVector2D(0, 0)
<< QVector2D(0, 0) << QVector2D(1, 0) << QVector2D(1, 1) // Bottom
<< QVector2D(1, 1) << QVector2D(0, 1) << QVector2D(0, 0);
texture = bindTexture(QPixmap(":/texture.png"));
//! [3]
//! [4]
}
//! [4]
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);
}
//! [5]
void GlWidget::paintGL()
{
//! [5]
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);
//! [6]
shaderProgram.bind();
shaderProgram.setUniformValue("mvpMatrix", pMatrix * vMatrix * mMatrix);
shaderProgram.setUniformValue("texture", 0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
glActiveTexture(0);
shaderProgram.setAttributeArray("vertex", vertices.constData());
shaderProgram.enableAttributeArray("vertex");
shaderProgram.setAttributeArray("textureCoordinate", textureCoordinates.constData());
shaderProgram.enableAttributeArray("textureCoordinate");
glDrawArrays(GL_TRIANGLES, 0, vertices.size());
shaderProgram.disableAttributeArray("vertex");
shaderProgram.disableAttributeArray("textureCoordinate");
shaderProgram.release();
}
//! [6]
void GlWidget::mousePressEvent(QMouseEvent *event)
{
lastMousePosition = event->pos();
event->accept();
}
void GlWidget::mouseMoveEvent(QMouseEvent *event)
{
int deltaX = event->x() - lastMousePosition.x();
int deltaY = event->y() - lastMousePosition.y();
if (event->buttons() & Qt::LeftButton) {
alpha -= deltaX;
while (alpha < 0) {
alpha += 360;
}
while (alpha >= 360) {
alpha -= 360;
}
beta -= deltaY;
if (beta < -90) {
beta = -90;
}
if (beta > 90) {
beta = 90;
}
updateGL();
}
lastMousePosition = event->pos();
event->accept();
}
void GlWidget::wheelEvent(QWheelEvent *event)
{
int delta = event->delta();
if (event->orientation() == Qt::Vertical) {
if (delta < 0) {
distance *= 1.1;
} else if (delta > 0) {
distance *= 0.9;
}
updateGL();
}
event->accept();
}
这可以在Mac上运行吗?如果不能,我应该改变什么呢?
答案 0 :(得分:1)
在MacOS X上,您不需要glext.h
,因为可用的(最大)OpenGL版本由操作系统版本决定。所以当用例如编译时Yosemite SDK已经涵盖了OpenGL-4。
Windows不同。声称支持的唯一OpenGL版本是Windows Vista之前的OpenGL-1.1和Vista之后的OpenGL-1.4;所有Windows版本支持的唯一ABI是OpenGL-1.1。因此,您必须使用扩展机制来获得更多功能。
* nix系统类似,不同的是共同基线是OpenGL-1.2