相关疑难解决方法(0)

转换GLSL现代OpenGL 3.2

我正在使用Xcode 5在运行10.9的mac上关注wikibooks上的freetype教程.我使用着色器版本120运行但是我想使用一些现代功能,所以我将SDL提示设置为OpenGL 3.2并将我的着色器转换为150.问题出在版本150中,使用texture2D将阻止着色器编译.

以下是着色器的版本120:

const GLchar* vTextSource =
"#version 120\n"
"attribute vec4 coord;"
"varying vec2 texcoord;"
"void main(void) {"
"  gl_Position = vec4(coord.xy, 0, 1);"
"  texcoord = coord.zw;"
"}";

const GLchar* fTextSource =
"#version 120\n"
"varying vec2 texcoord;"
"uniform sampler2D tex;"
"uniform vec4 color;"
"void main(void) {"
"  gl_FragColor = vec4(1,1,0, texture2D(tex, texcoord).a) * color;"
"}";
Run Code Online (Sandbox Code Playgroud)

这就是我对版本150所拥有的.顶点着色器构建但片段着色器失败,除非我删除了texture2D的任何用途.它们之间的所有CPU代码都是相同的.

const GLchar* vTextSource =
"#version 150 \n"
"in vec4 coord;"
"out vec2 texcoord;"
"void main(void) {"
"  gl_Position = vec4(coord.xy, 0, 1);" …
Run Code Online (Sandbox Code Playgroud)

c++ opengl glsl

3
推荐指数
1
解决办法
959
查看次数

OpenGL:glEnableVertexAttribArray之后的INVALID_OPERATION

我正在将一个正常运行的OpenGL应用程序从Windows移植到OSX,并在调用后不断收到"无效操作"(代码1282)错误glEnableVertexAttribArray().这是渲染方法:

gl::Disable(gl::DEPTH_TEST);    
gl::Disable(gl::CULL_FACE);
gl::PolygonMode(gl::FRONT_AND_BACK,gl::FILL);

/// render full-screen quad
gl::UseProgram(m_program);

check_gl_error();

gl::BindBuffer(gl::ARRAY_BUFFER, m_vertexBuffer);
gl::BindBuffer(gl::ELEMENT_ARRAY_BUFFER, m_indexBuffer);

check_gl_error();
GLint positionLocation = -1;

positionLocation = gl::GetAttribLocation(m_program,"Position");
check_gl_error();

/// positionLocation now == 0

gl::EnableVertexAttribArray(positionLocation);
//// ************ ERROR RETURNED HERE **********************
//// ************ ERROR RETURNED HERE **********************
check_gl_error();

gl::VertexAttribPointer(positionLocation,3,gl::FLOAT,false,3 * sizeof(GLfloat),(const GLvoid*)0);
check_gl_error();

gl::DrawElements(gl::TRIANGLES,m_indexCount,gl::UNSIGNED_SHORT,0);

check_gl_error();

gl::BindBuffer(gl::ARRAY_BUFFER,0);
check_gl_error();

gl::BindBuffer(gl::ELEMENT_ARRAY_BUFFER,0);
check_gl_error();
Run Code Online (Sandbox Code Playgroud)

check_gl_error() 只是得到最后一个GL错误并返回一个有点可读的描述.

此代码在Windows下正常工作.但是,正如我正在迅速学习,这并不一定意味着它是正确的.我已经验证了所有以前绑定的对象(程序,顶点缓冲区,索引缓冲区)都是有效的句柄.glGetAttribLocation()返回Position属性的有效位置(在本例中为0).

失败的情况是glEnableVertexAttribArray()什么?我之前没有设置一些州吗?

如果我注释掉绘制代码,窗口将被清除为我的测试颜色(红色)(从代码片段中未显示的方法调用)在每个帧上,其他一切正常,这意味着其他一切都是正确的.

建议?

哦,对于GL状态机模拟器,它会告诉我为什么它是"无效操作".(或者参考一些神秘的,神奇的文档,描述每个gl*调用所需的输入状态.)

c++ opengl macos xcode5

2
推荐指数
1
解决办法
2598
查看次数

标签 统计

c++ ×2

opengl ×2

glsl ×1

macos ×1

xcode5 ×1