При использовании OpenGL GLFW в веб-сборке (emscripten) фон холста прозрачен. Можно ли сделать его непрозрачным?
Вызывается следующие строки, но они не видны.
glClearColor(1.0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT);
Только область, нарисованная программой шейдера, является непрозрачной и видимой. Любая идея?
Полный код здесь:
main. cpp
#include <iostream>
#include <emscripten/emscripten.h>
#include <GLFW/glfw3.h>
#include <GLES3/gl3.h>
#define GLFW_INCLUDE_ES3
GLFWwindow * window;
static void generate_frame() {
glClearColor(1.0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT);
// the sun
//drawCircle(1,1,0);
glfwSwapBuffers(window);
glfwPollEvents();
}
int main() {
if (!glfwInit()) {
std::cout << "Init error";
emscripten_force_exit(EXIT_FAILURE);
}
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_VISIBLE, GL_TRUE);
window = glfwCreateWindow(800, 600, "Hello", 0, 0);
if (!window) {
std::cout << "Window creation error!";
glfwTerminate();
emscripten_force_exit(EXIT_FAILURE);
}
glfwMakeContextCurrent(window);
std::cout << "Init :: checking OpenGL version:\n";
const unsigned char * msg;
msg = glGetString(GL_VERSION);
std::cout << msg << "\n Shader language version: \n";
msg = glGetString(GL_SHADING_LANGUAGE_VERSION);
std::cout << msg << "\n";
std::cout << "Running bolierplate" << "\n";
// render loop
emscripten_set_main_loop(generate_frame, 0, true);
glfwTerminate();
emscripten_force_exit(EXIT_FAILURE);
}
index. html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<canvas id="canvas" oncontextmenu="event.preventDefault()"></canvas>
<script type='text/javascript'>
var canv = document.getElementById('canvas');
var Module = {
canvas: canv
};
</script>
<script src="index.js"></script>
</body>
</html>
Команда построения :
emcc main.cpp -std=c++11 -s USE_WEBGL2=1 -s FULL_ES3=1 -s USE_GLFW=3 -s WASM=1 -O3 -o index.js
Также найден пример для SDL с emscripten, и он работает с прозрачным фоном. В GLFW 3.3, похоже, есть API-интерфейс glfwSetWindowOpacity для установки прозрачности. Но GLFW 3.2 (поддерживаемый emscripten) не имеет этого API.