vs2022的opengles3.0环境配置利用PowerVR SDK的库【deepseek的帮助】集显电脑

本身的集显电脑不支持原生egl环境,且mali emulator已经不提供下载(跑过这个的示例,跑不通)

下载PowerVR的sdk并解压

https://github.com/powervr-graphics/Native_SDK

红色部分为一会要用到的位置

用vs2022新建一个空c++项目,然后项目-->属性

修改这两处

链接器-->输入-->附加依赖项,也要改

源文件先新建一个cpp文件,先随便跑一个三角形测试样例代码,注意是意是跑不起来的

#include <windows.h>      // Windows API
#include <EGL/egl.h>     // EGL
#include <GLES3/gl3.h>   // OpenGL ES 3.0
#include <iostream>      // 错误输出

// 窗口消息处理函数
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    if (uMsg == WM_DESTROY) {
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

int main() {
    // 1. 注册窗口类(ANSI 版本)
    HINSTANCE hInstance = GetModuleHandle(NULL);
    const char* className = "GLES3Window";

    WNDCLASSA wc = {};  // 注意是 WNDCLASSA
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = className;
    RegisterClassA(&wc);  // 使用 RegisterClassA

    // 2. 创建窗口(ANSI 版本)
    HWND window = CreateWindowExA(
        0,                      // 扩展样式
        className,               // 类名
        "OpenGL ES 3.0 Triangle", // 窗口标题
        WS_OVERLAPPEDWINDOW,     // 窗口样式
        CW_USEDEFAULT, CW_USEDEFAULT, // 位置
        800, 600,                // 大小
        NULL, NULL, hInstance, NULL
    );
    ShowWindow(window, SW_SHOW);

    // 3. 初始化 EGL
    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
    eglInitialize(display, NULL, NULL);

    // 4. 配置 EGL
    const EGLint configAttribs[] = {
        EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT,
        EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
        EGL_NONE
    };
    EGLConfig config;
    EGLint numConfigs;
    eglChooseConfig(display, configAttribs, &config, 1, &numConfigs);

    // 5. 创建 EGL 表面
    EGLSurface surface = eglCreateWindowSurface(display, config, window, NULL);

    // 6. 创建 OpenGL ES 3.0 上下文
    EGLint contextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE };
    EGLContext context = eglCreateContext(display, config, NULL, contextAttribs);
    eglMakeCurrent(display, surface, surface, context);

    // 7. 编译着色器(GLSL 300 ES)
    const char* vertexShaderSrc = R"(
        #version 300 es
        layout(location = 0) in vec3 aPos;
        void main() {
            gl_Position = vec4(aPos, 1.0);
        }
    )";

    const char* fragmentShaderSrc = R"(
        #version 300 es
        precision mediump float;
        out vec4 FragColor;
        void main() {
            FragColor = vec4(1.0, 0.5, 0.2, 1.0); // 橙色
        }
    )";

    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vertexShaderSrc, NULL);
    glCompileShader(vertexShader);

    GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader, 1, &fragmentShaderSrc, NULL);
    glCompileShader(fragmentShader);

    GLuint program = glCreateProgram();
    glAttachShader(program, vertexShader);
    glAttachShader(program, fragmentShader);
    glLinkProgram(program);

    // 8. 设置顶点数据
    float vertices[] = {
        -0.5f, -0.5f, 0.0f, // 左下
         0.5f, -0.5f, 0.0f, // 右下
         0.0f,  0.5f, 0.0f  // 顶部
    };

    GLuint VBO, VAO;
    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);
    glBindVertexArray(VAO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
    glEnableVertexAttribArray(0);

    // 9. 主循环
    MSG msg;
    while (true) {
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
            if (msg.message == WM_QUIT) break;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

        // 渲染
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);
        glUseProgram(program);
        glBindVertexArray(VAO);
        glDrawArrays(GL_TRIANGLES, 0, 3);
        eglSwapBuffers(display, surface);
    }

    // 10. 清理资源
    eglDestroyContext(display, context);
    eglDestroySurface(display, surface);
    eglTerminate(display);
    DestroyWindow(window);
    return 0;
}

打开文件夹找到exe所在目录,放入libGLESv2.dll和libEGL.dll文件,我已经放完了

红色路径【powerSDK的lib库windows里面】下复制这两个dll文件

配置完毕了,现在再运行一次,跑通了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值