Непрозрачный фон для веб-сборки OpenGL GLFW окно в браузере - PullRequest
0 голосов
/ 15 апреля 2020

При использовании 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.

...