本身的集显电脑不支持原生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文件
配置完毕了,现在再运行一次,跑通了