当前位置: 首页 > news >正文

苏州网站建设设计公众号同步到dede网站

苏州网站建设设计,公众号同步到dede网站,广州手机软件开发,石排镇网站建设公司一、简介 本文介绍了如何使用 OpenGL 中的 compute shader 进行矩阵相乘的并行运算。代码目标是#xff0c;输入两个大小为 10*10 的矩阵 A 和 B#xff0c;计算 A*B 的结果并存储到矩阵 C 中。 二、代码 0. 代码逻辑 1. 初始化 glfw, glad, 窗口 2. 初始化 compute shad…一、简介 本文介绍了如何使用 OpenGL 中的 compute shader 进行矩阵相乘的并行运算。代码目标是输入两个大小为 10*10 的矩阵 A 和 B计算 A*B 的结果并存储到矩阵 C 中。 二、代码 0. 代码逻辑 1. 初始化 glfw, glad, 窗口 2. 初始化 compute shader 3. 准备输入数据 4. 运行 compute shader 5. 读取结果并打印 6. 释放资源1. main.cpp #include glad/glad.h #include GLFW/glfw3.h #include ComputeShader.hpp#include cstdint #include iostream #include iostream// 用于处理窗口大小改变的回调函数 void framebuffer_size_callback(GLFWwindow *window, int width, int height); void window_close_callback(GLFWwindow *window);// 用于处理用户输入的函数 void processInput(GLFWwindow *window);// 指定窗口默认width和height像素大小 unsigned int SCR_WIDTH 800; unsigned int SCR_HEIGHT 600;/************************************/int main() {/****** 1. 初始化 glfw, glad, 窗口 *******/// glfw 初始化 配置 glfw 参数glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);// glfw 生成窗口GLFWwindow *window glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, LearnOpenGL, NULL, NULL);if (window NULL){// 检查是否成功生成窗口如果没有成功打印出错信息并且退出std::cout Failed to create GLFW window std::endl;glfwTerminate();return -1;}// 设置窗口window的上下文glfwMakeContextCurrent(window);// 配置window变化时的回调函数glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);// 设置窗口关闭回调glfwSetWindowCloseCallback(window, window_close_callback);// 使用 glad 加载 OpenGL 中的各种函数if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout Failed to initialize GLAD std::endl;return -1;}/************************************//****** 2. 初始化 compute shader ******/ComputeShader computeShader(../resources/Compute.comp);/************************************//****** 3. 准备输入数据 ******/// 输入矩阵 Afloat A[100];for (int i 0; i 10; i){for (int j 0; j 10; j){A[i * 10 j] 1.0f * i;}}// 输入矩阵 Bfloat B[100];for (int i 0; i 10; i){for (int j 0; j 10; j){B[i * 10 j] 1.0f * i;}}// 输出矩阵 Cfloat C[100];GLuint SSBO_A, SSBO_B, SSBO_C;glGenBuffers(1, SSBO_A);glGenBuffers(1, SSBO_B);glGenBuffers(1, SSBO_C);glBindBuffer(GL_SHADER_STORAGE_BUFFER, SSBO_A);glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(A), A, GL_STATIC_READ);glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, SSBO_A);glBindBuffer(GL_SHADER_STORAGE_BUFFER, SSBO_B);glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(B), B, GL_STATIC_READ);glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, SSBO_B);glBindBuffer(GL_SHADER_STORAGE_BUFFER, SSBO_C);glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(C), C, GL_DYNAMIC_DRAW);glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, SSBO_C);/************************************//****** 4. 运行 compute shader ******/// 运行 compute shader, 分为 10*10*1 个 workgroup, 每个 workgroup 计算 C 矩阵中的一个元素值computeShader.use();glDispatchCompute((unsigned int)10, (unsigned int)10, 1);glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);/************************************//****** 5. 读取结果并打印 ******/glBindBuffer(GL_SHADER_STORAGE_BUFFER, SSBO_C);glGetBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, sizeof(C), C);for (int row 0; row 10; row){for (int col 0; col 10; col){printf(%0.3f , C[row * 10 col]);}printf(\n);}/************************************//****** 6.释放资源 ******/// glfw 释放 glfw使用的所有资源glfwTerminate();/************************************/return 0; }// 用于处理用户输入的函数 void processInput(GLFWwindow *window) {// 当按下 Esc 按键时调用 glfwSetWindowShouldClose() 函数关闭窗口if (glfwGetKey(window, GLFW_KEY_ESCAPE) GLFW_PRESS){glfwSetWindowShouldClose(window, true);} }// 在使用 OpenGL 和 GLFW 库时处理窗口大小改变的回调函数 // 当窗口大小发生变化时确保 OpenGL 渲染的内容能够适应新的窗口大小避免图像被拉伸、压缩或出现其他比例失真的问题 void framebuffer_size_callback(GLFWwindow *window, int width, int height) {SCR_WIDTH width;SCR_HEIGHT height;glViewport(0, 0, width, height); } void window_close_callback(GLFWwindow *window) {// 这里可以做一些额外的清理工作// 例如释放资源、记录日志等std::cout Window is closing... std::endl; } 2. ComputeShader 类 #ifndef COMPUTESHADER_H #define COMPUTESHADER_H#include glad/glad.h #include glm/glm.hpp#include string #include fstream #include sstream #include iostreamclass ComputeShader {public:unsigned int ID;// constructor generates the shader on the fly// ------------------------------------------------------------------------ComputeShader() {};ComputeShader(const char *computePath){// 1. retrieve the vertex/fragment source code from filePathstd::string computeCode;std::ifstream cShaderFile;// ensure ifstream objects can throw exceptions:cShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);try{// open filescShaderFile.open(computePath);std::stringstream cShaderStream;// read files buffer contents into streamscShaderStream cShaderFile.rdbuf();// close file handlerscShaderFile.close();// convert stream into stringcomputeCode cShaderStream.str();}catch (std::ifstream::failure e){std::cout ERROR::SHADER::FILE_NOT_SUCCESSFULLY_READ: e.what() std::endl;}const char *cShaderCode computeCode.c_str();// 2. compile shadersunsigned int compute;// compute shadercompute glCreateShader(GL_COMPUTE_SHADER);glShaderSource(compute, 1, cShaderCode, NULL);glCompileShader(compute);checkCompileErrors(compute, COMPUTE);// shader ProgramID glCreateProgram();glAttachShader(ID, compute);glLinkProgram(ID);checkCompileErrors(ID, PROGRAM);// delete the shaders as theyre linked into our program now and no longer necessaryglDeleteShader(compute);}// activate the shader// ------------------------------------------------------------------------void use() const{glUseProgram(ID);}// ------------------------------------------------------------------------void setInt(const std::string name, int value) const{glUniform1i(glGetUniformLocation(ID, name.c_str()), value);}private:// utility function for checking shader compilation/linking errors.// ------------------------------------------------------------------------void checkCompileErrors(GLuint shader, std::string type){GLint success;GLchar infoLog[1024];if (type ! PROGRAM){glGetShaderiv(shader, GL_COMPILE_STATUS, success);if (!success){glGetShaderInfoLog(shader, 1024, NULL, infoLog);std::cout ERROR::SHADER_COMPILATION_ERROR of type: type \n infoLog \n -- --------------------------------------------------- -- std::endl;}}else{glGetProgramiv(shader, GL_LINK_STATUS, success);if (!success){glGetProgramInfoLog(shader, 1024, NULL, infoLog);std::cout ERROR::PROGRAM_LINKING_ERROR of type: type \n infoLog \n -- --------------------------------------------------- -- std::endl;}}} }; #endif 3. compute shader (Compute.comp) #version 430layout(std430, binding 0) buffer inputMatrixA { float A[]; }; layout(std430, binding 1) buffer inputMatrixB { float B[]; }; layout(std430, binding 2) buffer OnputData { float C[]; };layout(local_size_x 1,local_size_y 1) in; // 每个 workgroup item 计算 C 的一个元素void main() {// 获取当前 workgroup item 的全局位置uint row gl_GlobalInvocationID.x;uint col gl_GlobalInvocationID.y;// 确保不会越界if (row 10 || col 10) {return;}// 从矩阵 A 和矩阵 B 中读取数据float valueA 0.0f;float valueB 0.0f;// 计算矩阵 C 中对应的元素float result 0.0;for (int k 0; k 10; k) {valueA A[row * 10 k];valueB B[k * 10 col];result valueA * valueB; // 矩阵乘法}C[row * 10 col] result; } 4. 运行结果 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 45.000 45.000 45.000 45.000 45.000 45.000 45.000 45.000 45.000 45.000 90.000 90.000 90.000 90.000 90.000 90.000 90.000 90.000 90.000 90.000 135.000 135.000 135.000 135.000 135.000 135.000 135.000 135.000 135.000 135.000 180.000 180.000 180.000 180.000 180.000 180.000 180.000 180.000 180.000 180.000 225.000 225.000 225.000 225.000 225.000 225.000 225.000 225.000 225.000 225.000 270.000 270.000 270.000 270.000 270.000 270.000 270.000 270.000 270.000 270.000 315.000 315.000 315.000 315.000 315.000 315.000 315.000 315.000 315.000 315.000 360.000 360.000 360.000 360.000 360.000 360.000 360.000 360.000 360.000 360.000 405.000 405.000 405.000 405.000 405.000 405.000 405.000 405.000 405.000 405.000三、参考 [1]LearnOpenGL-Guest Articles-2022-Compute Shaders
http://www.dnsts.com.cn/news/274325.html

相关文章:

  • 做好网站建设的重要性深圳三站合一网站建设
  • 用wordpress建立学校网站吗能制作网站的软件
  • 宿迁建设局网站a类证查询西宁最好网站建设公司哪家好
  • 如何建造网站深圳网站建设信科便宜
  • 如何做自己网站的访问记录oshin wordpress
  • 网站编程语言排行榜广东东莞发布最新消息
  • 如何自己建个网站企业网站 案例
  • 阿里云网站怎么备案域名网站开发语言入门
  • 怎么制作网站游戏微信定制开发
  • 云建网站石家庄封控最新消息
  • 宣化网站制作公司网站建设维护服务协议
  • CP网站开发制作H5秒收的网站
  • 成品网站w灬源码1688网页版建设企业网站网站崩溃
  • 漫画网站php源码网络安全运维工程师
  • 网站制作公司相关工作海南信息港官网
  • 建设银行门户网站wordpress能用的插件吗
  • 设计新颖的网站建设jsp网站设计
  • 扬州润扬交通建设集团网站做图的模板下载网站
  • 在网站上怎么做推广网站搭建需要多少钱?
  • 网站建设系统公司推荐聊城做网站
  • 做网站的是什么职位如何将优酷视频放到自己的网站
  • 做网站哪种编程语言好推广代运营公司
  • 专业的团队网站建设汉阴网站建设
  • 公司网站 开源专业微网站开发
  • 龙岗平湖网站建设公司泰州网站建设与网页制作
  • 山西网站开发二次开发白云区是穷人区吗
  • 网站开发主要任务签了外包合同被辞退有补偿吗
  • 公司百度网站建设广州网站建设服务
  • 国内高清视频素材网站有深度网站
  • 做网站怎么做放大图片农夫山泉vi设计案例