glext.h Windows 和 Mac
glext.h for Windows and Mac
我正在尝试通过 qt-project 提供的教程学习 OpenGL 和 Qt。
我需要编写一个可以在 Windows 和 Mac 上 运行 的应用程序。但是我可能对他们给出的示例有疑问:在使用 glext.h 库时,他们指定 OS 是 windows(WIN32 的东西)。现在我不确定他们的例子是否可以 运行 on 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 上可以吗?如果不能,我应该更改什么?
在 MacOS X 上您不需要 glext.h
,因为可用的(最大)OpenGL 版本由 OS 版本决定。所以当用例如编译时Yosemite SDK 它已经涵盖了 OpenGL-4。
Windows不一样。唯一声称受支持的 OpenGL 版本是 Windows Vista 之前的 OpenGL-1.1 和 Vista 之后的 OpenGL-1.4;所有 Windows 版本唯一支持的 ABI 是 OpenGL-1.1。所以你必须使用扩展机制来获得更多的功能。
*nix 系统相似,不同之处在于共同的基线是 OpenGL-1.2
我正在尝试通过 qt-project 提供的教程学习 OpenGL 和 Qt。 我需要编写一个可以在 Windows 和 Mac 上 运行 的应用程序。但是我可能对他们给出的示例有疑问:在使用 glext.h 库时,他们指定 OS 是 windows(WIN32 的东西)。现在我不确定他们的例子是否可以 运行 on 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 上可以吗?如果不能,我应该更改什么?
在 MacOS X 上您不需要 glext.h
,因为可用的(最大)OpenGL 版本由 OS 版本决定。所以当用例如编译时Yosemite SDK 它已经涵盖了 OpenGL-4。
Windows不一样。唯一声称受支持的 OpenGL 版本是 Windows Vista 之前的 OpenGL-1.1 和 Vista 之后的 OpenGL-1.4;所有 Windows 版本唯一支持的 ABI 是 OpenGL-1.1。所以你必须使用扩展机制来获得更多的功能。
*nix 系统相似,不同之处在于共同的基线是 OpenGL-1.2