正如我们最终都知道的那样,规范是一回事,而实现则是另一回事.我们自己造成的大多数错误,但有时并非如此.
我相信制作一个小清单是有用的:
请记得始终发布相关的显卡和驱动程序版本.
我正在尝试在Qt 4.8.2中使用QGLWidget.我注意到QGLWidget创建的默认上下文没有显示3.1以上的OpenGL的任何输出.Qt wiki有一个教程,演示如何使用OpenGL 3.3绘制一个简单的三角形.当我尝试运行教程时,我得到一个空白屏幕.如果我将OpenGL版本更改为3.1,我会得到预期的输出(红色三角形).
我的视频卡支持OpenGL 4.2,QGLFormat::openGLVersionFlags()在创建QGLWidget之前调用显示Qt检测到OpenGL 4.2和所有以前的桌面版本.
这是另一个最小的例子:
#include <QApplication>
#include <QGLWidget>
#include <QDebug>
#include <QtDeclarative/qdeclarativeview.h>
int main(int argc, char * argv[])
{
QApplication app(argc, argv);
qDebug() << "OpenGL Versions Supported: " << QGLFormat::openGLVersionFlags();
QGLFormat qglFormat;
qglFormat.setVersion(4,2); // get expected output with (3,1) and below, else blank window
qglFormat.setProfile(QGLFormat::CoreProfile);
qglFormat.setSampleBuffers(true);
QGLWidget* qglWidget = new QGLWidget(qglFormat);
QString versionString(QLatin1String(reinterpret_cast<const char*>(glGetString(GL_VERSION))));
qDebug() << "Driver Version String:" << versionString;
qDebug() << "Current Context:" << qglWidget->format();
QDeclarativeView mainView;
mainView.setViewport(qglWidget);
mainView.setSource(QString("helloworld.qml"));
mainView.show(); …Run Code Online (Sandbox Code Playgroud) 我在Mac上,使用Swift,并使用OpenGL 3.2.我也在使用XCode 6.1 Beta,所以我认为这是最可能的解释,因为在我看来,这似乎没有意义.
我找不到任何证据表明不应该支持这个,但是这个片段着色器Invalid call of undeclared identifier 'texture2D'在编译期间导致错误:
#version 150
uniform sampler2D usTexture;
in vec2 vTextureCoord;
out vec4 FragColor;
void main() {
vec4 color = texture2D(usTexture, vTextureCoord);
FragColor = color;
}
Run Code Online (Sandbox Code Playgroud) OpenGL的GLSL在多大程度上利用了SLI设置?它是在执行时使用还是仅用于结束渲染?
同样,我知道OpenCL与SLI不同,但假设有一个GPU,那么它与多处理中的GLSL相比如何呢?
由于它可能取决于应用程序,例如常见转换或光线跟踪,您是否可以根据应用类型提供有关差异的见解?
有人可以建议学习OpenGL 3.2核心配置文件的指南吗?
SDK很难阅读,我见过的大部分指南都只教授旧方法.
代码的核心(显示红色矩形):
//bind program, set uniforms, bind vbo
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0,0);
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableVertexAttribArray(0);
//unbind vbo, unbind program
Run Code Online (Sandbox Code Playgroud)
当我上下文切换到的OpenGL 3.x的这一代码将停止工作(我可以看到背景的唯一的颜色),但是当我初始化VAO以同样的方式与上面的代码,然后我结合VAO并调用调用glDrawArrays,然后它工作.
可能是什么问题呢?如何在不使用VAO的情况下绘制VBO?
(着色器非常简单,只有mulitplies矩阵和ps输出红色)
我有关于各种顶点属性维也纳组织一个VAO:顶点位置,顶点法线,和元件阵列VBO(所有STATIC_DRAW),从而呈现一个实例只要求:
glBindVertexArray(vao);
glDrawElements(GL_TRIANGLES, <count>, <type>, 0);
Run Code Online (Sandbox Code Playgroud)
但是,我想绘制一个对象的多个实例(我仅限于OS X GL 3.2核心配置文件BTW),每个实例具有不同的顶点纹理(s,t)坐标.texcoord VBO使用STREAM_DRAW提示(尽管我可能会使用DYNAMIC_DRAW).
它是更有效地结合VAO,结合当前texcoord VBO,并通过设置属性指针glVertexAttribPointer,最终确定与VAO glBindVertexArray(0)并画出一个带有不同纹理坐标的新实例?或者更新VAO的成本是否会使这种方法变得糟糕?如何glBufferSubData在绑定的VAO中更新texcoord VBO ?
在对单独的方法进行基准测试之前,我真的很感激一些反馈,因为错误的选择将导致重大的重构.
我试图寻找可以在OpenGL中使用Sync Objects的场景.我的理解是,一旦放入GL命令流(使用glFenceSync())的同步对象将在执行并实现所有GL命令后发出信号.如果同步对象是同步原语,为什么我们不能手动发信号呢?这个功能究竟在哪里可以帮助GL程序员?
以下方案是否正确?
Thread 1 :
Load model
Draw()
glFenceSync()
Thread 2 :
glWaitSync();
ReadPixels
Use data for subsequent operation.
Run Code Online (Sandbox Code Playgroud)
这是否意味着除非在线程1中调用glFenceSync(),否则我无法启动线程2?
多年来我一直使用传统的openGL和cocoa,但我现在正努力转向openGL 3.2.互联网上有几个例子,但它们都太复杂了(很多甚至在XCode 5.1下都不再编译).有人可以写一个最简单,最简单的最小可可代码的例子,只是为了在NSOpenGLView中绘制一个读三角形吗?(没有花哨的着色器,没有displayCallbacks,代码行越少越好).
我在使用顶点缓冲区对象时遇到了麻烦,而没有使用顶点数组对象.
我的理解是VAO只是封装了VBO周围的状态.但是,如果没有VAO,VBO不应该可用吗?
这是一个小例子.有了use_vao=true这个工作正常(橙色呈现矩形).有了use_vao=false这使它什么,并生成GL_INVALID_OPERATION时的错误glDrawElements.
// make sure the modern opengl headers are included before any others
#include <OpenGL/gl3.h>
#define __gl_h_
#include <GLUT/glut.h>
#include <string>
#include <cassert>
// For rendering a full-viewport quad, set tex-coord from position
std::string tex_v_shader = R"(
#version 330 core
in vec3 position;
void main()
{
gl_Position = vec4(position,1.);
}
)";
// Render directly from color or depth texture
std::string tex_f_shader = R"(
#version 330 core
out vec4 …Run Code Online (Sandbox Code Playgroud)