我想要做的是从单个通道数据阵列将纹理加载到硬件中,并使用它的alpha通道将文本绘制到对象上.我正在使用opengl 4.
如果我尝试使用4通道RGBA纹理这样做,它可以很好地工作,但无论出于何种原因,当我尝试加载单个通道时,我只会得到一个乱码图像,我无法找出原因.我通过将一系列字形的纹理位图数据与以下代码组合成单个纹理来创建纹理:
int texture_height = max_height * new_font->num_glyphs;
int texture_width = max_width;
new_texture->datasize = texture_width * texture_height;
unsigned char* full_texture = new unsigned char[new_texture->datasize];
// prefill texture as transparent
for (unsigned int j = 0; j < new_texture->datasize; j++)
full_texture[j] = 0;
for (unsigned int i = 0; i < glyph_textures.size(); i++) {
// set height offset for glyph
new_font->glyphs[i].height_offset = max_height * i;
for (unsigned int j = 0; j < new_font->glyphs[i].height; j++) {
int full_disp = (new_font->glyphs[i].height_offset …Run Code Online (Sandbox Code Playgroud) RedBook中的NURBS章节已被弃用,包括实用程序库:"尽管其中一些功能是GLU库的一部分,但它依赖于已从核心OpenGL库中删除的功能."
这是否意味着OpenGL 4.2实际上缺少用于操纵NURBS曲线和曲面的C++工具包?有一些商业第三方工具包,但它们不是跨平台(主要是windows)
...?
我可以在哪里下载C/C++的OpenGL 4.0头文件?我发现只有GL/gl.h在/compiler/include/,但它已经过时(的OpenGL 1.1).
不要提供像GLEW这样的图书馆.我想用纯OpenGL编写我的应用程序.
我最近使用红皮书第8版开始使用Open GL 4.0.从早上开始到现在,我无法编译OpenGL程序的"HelloWorld".
我配置了依赖项,将freeGlut/GLEW/GLSL的文件内容传输到我的VS 2013 C++ IDE的相应VC文件夹.我最终确信事件发生故障的催化剂发生的原因是VS在不同位置引用了多个lib文件,并且链接器无法对它所引用的内容进行直截了当.
然而,我意识到另一个我天真/无知的问题.我可以编译问题不是因为我的依赖配置,而是因为我只有一个内置芯片组而不是卡而没有MESA?
我不知道我的内置芯片组是否支持openGL 4.0
英特尔(R)HD Graphics 4000
编辑:我在VS 2013中的编译错误没有给出硬件问题的"线索".所有这些都是LNK2005问题.
我正在尝试在支持 OpenGL 4.1 的 OSX Mavericks 上学习 OpenGL。
我保持基本并使用 gcc (g++) 进行编译,但是当通过 Freeglut OSX 加载开放的 GL 上下文时,会加载旧的 OpenGL 配置文件。
我试过这个:OpenGL 3.3 on OSX with FreeGLUT但没有运气, glGetString 调用返回这些值:
NVIDIA GeForce GT 750M OpenGL Engine
2.1 NVIDIA-8.24.9 310.40.25f01
Run Code Online (Sandbox Code Playgroud)
谁有想法?
我正在使用以下上下文调用调用 FreeGlut:
glutInitContextVersion(3,2);
glutInitContextProfile(GLUT_CORE_PROFILE);
Run Code Online (Sandbox Code Playgroud)
编辑:刚刚在 Windows 而不是 OSX 中尝试了相同的应用程序并收到此错误:
2.1 已请求上下文但 wglCreateContextAttribsARB 不可用。回退到遗留上下文创建
这是我的应用程序入口点
int main (int argc, char * argv[])
{
try{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA);
glutInitWindowSize(512,512);
glutInitContextVersion(4,2);
glutInitContextFlags(GLUT_FORWARD_COMPATIBLE);
glutInitContextProfile(GLUT_CORE_PROFILE);
cout << "Called GLUT with 'GLUT_FORWARD_COMPATIBLE' \n";
//cout << VAO_IDs::NumVAOs;
glutCreateWindow("Triangles!"); …Run Code Online (Sandbox Code Playgroud) glViewport:宽度/高度是整数(像素)。
但是 glViewportIndexed 在浮点数中具有这些值。让它们浮动有什么好处。我的理解是基于像素总是整数这一事实。
我已经看到一些有希望的参考,能够在现代OpenGL上运行Qt5.我正在使用以下代码将我的QQuickView设置为OpenGL 4.1 Core(我的MacBook上支持OSX 10.9的最新版本).
QSurfaceFormat sf = g_mainView->format();
sf.setProfile(QSurfaceFormat::CoreProfile);
sf.setVersion(4, 1);
g_mainView->setFormat(sf);
Run Code Online (Sandbox Code Playgroud)
大部分问题.首先,在尝试渲染文本时,应用程序完全崩溃.如果我恰好在我的QML中只有图像,矩形等,我会得到大量的片段着色器错误.
QOpenGLShader::compile(Fragment): ERROR: 0:1: '' : #version required and missing.
ERROR: 0:5: 'varying' : syntax error syntax error
*** Problematic Fragment shader source code ***
#define lowp
#define mediump
#define highp
varying highp vec2 qt_TexCoord0;
uniform highp float qt_Opacity;
uniform lowp sampler2D source;
uniform lowp sampler2D maskSource;
void main(void) {
gl_FragColor = texture2D(source, qt_TexCoord0.st) * (texture2D(maskSource, qt_TexCoord0.st).a) * qt_Opacity;
}
***
QQuickCustomMaterialShader: Shader compilation failed:
"ERROR: 0:1: '' …Run Code Online (Sandbox Code Playgroud) 我的大脑倾向于支持以层次化,面向对象,类似组件的方式构建概念.不幸的是,这使我无法理解OpenGL - 我怀疑我的困惑的根源在于我对"OpenGL状态机"的误解.你有图形管道,但这对于绘制用户图形组件的各个程序对象来说非常具体,对吧?
纯粹的超级采样抗锯齿 (SSAA) 和通过每样本着色进行多重采样之间有什么区别
gl4.glMinSampleShading(1.0f);
Run Code Online (Sandbox Code Playgroud)
我更喜欢后者,因为与 SSAA 相比,它不需要更大的纹理,并且提供了很大的灵活性。即:您甚至可以在运行时在 SS 和纯多重采样之间切换。
有什么我不知道的缺点吗?
我在 C++ 和 GLSL 410 中使用 OpenGL 4.5。
我最近遇到了一个问题,我试图设置着色器程序的统一变量,而没有首先使用带有glUseProgram. 我有一个片段着色器,带有一个名为input_color(一个 vec4,我会将输出颜色设置为)的统一变量附加到我的shader_program. 请注意,在绘制任何应该使用它的东西之前,我会调用glUseProgram(shader_program)我的主绘制循环。
// set uniforms
GLint input_color = glGetUniformLocation(shader_program, "input_color");
glUniform4f(input_color, 0.5f, 0.3f, 0.2f, 1.0f);
Run Code Online (Sandbox Code Playgroud)
用这个程序绘制的三角形全黑,不是我期望的结果。经过一些实验,我意识到我需要在设置制服之前使用该程序。
// set uniforms
glUseProgram(shader_program); // my change
GLint input_color = glGetUniformLocation(shader_program, "input_color");
glUniform4f(input_color, 0.5f, 0.3f, 0.2f, 1.0f);
Run Code Online (Sandbox Code Playgroud)
绘图会产生正确颜色的三角形。
我的问题是为什么我需要先开始使用该程序?我知道 OpenGL 作为状态机工作,但在这种情况下,为什么需要当前的着色器程序状态?毕竟,我显式地将shader_program索引作为参数传递给glGetUniformLocation以获取input_color的内存索引。
我希望这个答案能帮助我更好地理解 OpenGL 中的状态,以及如何利用或管理表示 GPU 上着色器程序的内存块。