【发布时间】:2015-08-20 09:37:24
【问题描述】:
所以我正在尝试使用 emscripten 编译一些 SDL2 代码,但我遇到了一个又一个的陷阱,大多数我可以自己解决,但这让我感到困惑。
目前我正在尝试使用 OpenGL 在屏幕上绘制一个四边形:
void sprite::init(float x, float y, float width, float height)
{
_x = x;
_y = y;
_width = width;
_height = height;
if(_vboID == 0)
{
glGenBuffers(1, &_vboID);
}
float vertexData[12];
vertexData[0] = x + width;
vertexData[1] = y + height;
vertexData[2] = x;
vertexData[3] = y + height;
vertexData[4] = x;
vertexData[5] = y;
//second
vertexData[6] = x;
vertexData[7] = y;
vertexData[8] = x + width;
vertexData[9] = y;
vertexData[10] = x + width;
vertexData[11] = y + height;
glBindBuffer(GL_ARRAY_BUFFER, _vboID);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData),
vertexData, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
void sprite::draw()
{
glBindBuffer(GL_ARRAY_BUFFER, _vboID);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
这应该会生成一个四边形,或者人们会这么想。 当然,它不会,而是会产生一些错误
Error: WebGL: drawArrays: null CURRENT_PROGRAM sdl2.js:1:186510
Error: WebGL: No further warnings will be reported for this WebGL context. (already reported 32 warnings)
因此我们来到了问题的核心,如何解决这个问题?
【问题讨论】:
-
抱怨你没有绑定着色器程序。如果您不绑定着色器,OpenGL 不知道如何处理您发送的顶点数据。
-
真的,我只是认为这在某些芯片组上会是个问题,因为它在桌面 OpenGL 上运行良好;好吧,我认为这是平台之间的主要区别。非常感谢您的帮助,我将附上一个基本的漫反射着色器来代替此信息(我希望我可以等待,但我绝对必须知道它是否可以在浏览器中使用)
-
与芯片组无关。这是一个基本的 API,对于从 3.3(至少在非向后兼容模式下)和 OpenGL ES 2.+ 开始的 OpenGL 桌面也是如此。
-
嗯,它在某些 GPU 芯片组上运行良好,它可能不正确,但它们仍然呈现白色方块。 (桌面);不管编写着色器是否按预期工作,我只需要重新安排我的计划以比预期更早地集成着色器编译器,但经过一些试验和错误 WebGL 着色器编码后,现在一切正常(我知道 GLSL,这个版本虽然不同,但它都在运行现在)
-
如果它起作用是偶然的,而不是设计的。根据 OpenGL 标准,这种情况下的行为是未定义的,因此驱动程序可以随心所欲地做任何事情
标签: c++ opengl-es webgl emscripten