年早些時(shí)候,微軟宣布正在努力在Windows 10的Direct3D 12(D3D12)中啟用對OpenCL和OpenGL映射層的支持。為了啟用映射層,解決設(shè)備上沒有OpenCL和OpenGL硬件驅(qū)動(dòng)時(shí)的兼容性問題,公司目前已經(jīng)在微軟商店中發(fā)布了兼容性包。
該兼容性包的標(biāo)題為 "OpenCL和OpenGL兼容性包",目前可以從微軟商店(之前稱為Windows商店)中下載。該兼容性包針對的是運(yùn)行Windows 10 May 2020 Update、Windows 10 October 2020 Update或更新版本的系統(tǒng)。
在產(chǎn)品列表中,微軟指出,當(dāng)適當(dāng)?shù)挠布?qū)動(dòng)程序缺失或默認(rèn)情況下未啟用時(shí),這個(gè)兼容性包可以讓你在設(shè)備上運(yùn)行OpenCL和OpenGL應(yīng)用。Windows 10將在啟用硬件加速功能后自動(dòng)啟動(dòng)支持的應(yīng)用程序,以提高性能。
需要注意的是,只有設(shè)備和應(yīng)用支持DirectX 12時(shí),這個(gè)功能才會(huì)發(fā)揮作用。對于驅(qū)動(dòng)安裝齊全的計(jì)算機(jī)而言,只有很少一些應(yīng)用會(huì)使用這個(gè)兼容包,但微軟表示,它正在開發(fā)一個(gè)捆綁包,允許更多應(yīng)用使用兼容層。Windows Insiders可以獲得這個(gè)捆綁包的預(yù)覽版,并使用它來運(yùn)行更多的應(yīng)用。
微軟希望兼容性層能夠讓開發(fā)者和用戶更容易使用。目前,并不是每臺(tái)Windows機(jī)器都對OpenCL和OpenGL有很好的原生支持,而映射層將顯著提高兼容性。
Windows 10的OpenCL和OpenGL兼容包還將幫助生產(chǎn)力和創(chuàng)意應(yīng)用,所以它真的不僅僅是只能用于游戲
微軟正在鼓勵(lì)開發(fā)者將他們的應(yīng)用和游戲移植到DirectX 12上,微軟希望開發(fā)者社區(qū)和用戶能夠從通過微軟商店提供的Windows 10兼容層中受益。
OpenCL和OpenGL的兼容層下載地址:
https://www.microsoft.com/en-gb/p/opencl-and-opengl-compatibility-pack/9nqpsl29bfff?
算機(jī)圖形學(xué)的世界中,OpenGL 無疑是開發(fā)者們不可或缺的一部分。無論是游戲開發(fā)、虛擬現(xiàn)實(shí),還是科學(xué)可視化,OpenGL都能提供強(qiáng)大的支持。C++與OpenGL這兩者的結(jié)合,創(chuàng)造出令人驚嘆的3D圖形效果。
AI讓生活更美好
分享學(xué)習(xí)C/C++編程、機(jī)器人、人工智能等領(lǐng)域知識(shí)。
384篇原創(chuàng)內(nèi)容
公眾號
OpenGL(Open Graphics Library)是一個(gè)用于渲染2D和3D圖形的跨平臺(tái)、跨編程語言的應(yīng)用程序編程接口(API)。它由Khronos Group維護(hù)和發(fā)展,廣泛應(yīng)用于游戲開發(fā)、CAD軟件、虛擬現(xiàn)實(shí)、科學(xué)可視化等領(lǐng)域。
OpenGL提供了豐富的圖形渲染功能,包括幾何處理、光照、紋理映射等,使得開發(fā)者能夠高效地進(jìn)行圖形編程。
在開始編寫OpenGL程序之前,我們需要進(jìn)行一些環(huán)境配置。通常,我們需要安裝以下庫:
在Linux系統(tǒng)中,可以使用包管理器安裝這些庫。例如:
sudo apt-get install libglew-dev libglfw3-dev
在Windows系統(tǒng)中,可以從各自的官網(wǎng)下載安裝包或通過包管理工具(如vcpkg)安裝。
接下來,讓我們編寫一個(gè)簡單的C++ OpenGL程序,創(chuàng)建一個(gè)窗口并繪制一個(gè)三角形。
首先,我們使用CMake來配置項(xiàng)目。創(chuàng)建一個(gè)CMakeLists.txt文件:
cmake_minimum_required(VERSION 3.10)
project(OpenGLDemo)
set(CMAKE_CXX_STANDARD 11)
find_package(GLEW REQUIRED)
find_package(GLFW3 REQUIRED)
find_package(OpenGL REQUIRED)
add_executable(OpenGLDemo main.cpp)
target_link_libraries(OpenGLDemo GLEW::GLEW glfw OpenGL::GL)
在main.cpp中,編寫如下代碼:
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
// 窗口尺寸回調(diào)函數(shù)
void framebuffer_size_callback(GLFWwindow* window, int width, int height) {
glViewport(0, 0, width, height);
}
// 處理輸入
void processInput(GLFWwindow *window) {
if (glfwGetKey(window, GLFW_KEY_ESCAPE)==GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
}
int main() {
// 初始化GLFW
if (!glfwInit()) {
std::cerr << "Failed to initialize GLFW" << std::endl;
return -1;
}
// 創(chuàng)建窗口
GLFWwindow* window=glfwCreateWindow(800, 600, "OpenGL Demo", nullptr, nullptr);
if (!window) {
std::cerr << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
// 初始化GLEW
if (glewInit() !=GLEW_OK) {
std::cerr << "Failed to initialize GLEW" << std::endl;
return -1;
}
// 定義頂點(diǎn)數(shù)據(jù)
float vertices[]={
0.0f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f
};
// 創(chuàng)建頂點(diǎn)緩沖對象
GLuint VBO;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// 創(chuàng)建頂點(diǎn)數(shù)組對象
GLuint VAO;
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
// 解析頂點(diǎn)數(shù)據(jù)
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
// 主循環(huán)
while (!glfwWindowShouldClose(window)) {
// 處理輸入
processInput(window);
// 渲染指令
glClear(GL_COLOR_BUFFER_BIT);
// 繪制三角形
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES, 0, 3);
// 交換緩沖
glfwSwapBuffers(window);
glfwPollEvents();
}
// 清理資源
glDeleteVertexArrays(1, &VAO);
glDeleteBuffers(1, &VBO);
glfwTerminate();
return 0;
}
在上面的例子中,我們已經(jīng)能夠繪制一個(gè)簡單的三角形。但要實(shí)現(xiàn)更復(fù)雜和逼真的效果,我們需要利用OpenGL的著色器編程。著色器是運(yùn)行在GPU上的小程序,用于控制頂點(diǎn)和片段的處理方式。
首先,我們需要編寫頂點(diǎn)著色器和片段著色器。創(chuàng)建兩個(gè)文件:vertex_shader.glsl 和 fragment_shader.glsl。
#version 330 core
layout(location=0) in vec3 aPos;
void main() {
gl_Position=vec4(aPos, 1.0);
}
fragment_shader.glsl:
#version 330 core
out vec4 FragColor;
void main() {
FragColor=vec4(1.0, 0.5, 0.2, 1.0);
}
在main.cpp中,添加以下代碼來加載和編譯著色器:
#include <fstream>
#include <sstream>
std::string readShaderSource(const char* filePath) {
std::ifstream shaderFile(filePath);
std::stringstream shaderStream;
shaderStream << shaderFile.rdbuf();
return shaderStream.str();
}
GLuint compileShader(const char* source, GLenum shaderType) {
GLuint shader=glCreateShader(shaderType);
glShaderSource(shader, 1, &source, nullptr);
glCompileShader(shader);
int success;
char infoLog[512];
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
if (!success) {
glGetShaderInfoLog(shader, 512, nullptr, infoLog);
std::cerr << "Error: Shader compilation failed\n" << infoLog << std::endl;
}
return shader;
}
在主函數(shù)中,使用這些函數(shù)來編譯和鏈接著色器:
std::string vertexSource=readShaderSource("vertex_shader.glsl");
std::string fragmentSource=readShaderSource("fragment_shader.glsl");
GLuint vertexShader=compileShader(vertexSource.c_str(), GL_VERTEX_SHADER);
GLuint fragmentShader=compileShader(fragmentSource.c_str(), GL_FRAGMENT_SHADER);
GLuint shaderProgram=glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
int success;
char infoLog[512];
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if (!success) {
glGetProgramInfoLog(shaderProgram, 512, nullptr, infoLog);
std::cerr << "Error: Shader program linking failed\n" << infoLog << std::endl;
}
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
最后,在渲染循環(huán)中使用這個(gè)著色器程序:
glUseProgram(shaderProgram);
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES, 0, 3);
通過本文的介紹,相信大家已經(jīng)對C++與OpenGL的結(jié)合有了初步的認(rèn)識(shí)。從環(huán)境配置到繪制第一個(gè)三角形,再到深入的著色器編程,OpenGL為我們提供了強(qiáng)大的圖形渲染能力。在實(shí)際應(yīng)用中,你可以利用這些知識(shí),創(chuàng)建更加復(fù)雜和精美的圖形效果。