C++学习(四七八)GL_MAX_TEXTURE_SIZE

本文介绍了一种使用OpenGL API来获取当前系统支持的最大纹理尺寸的方法。通过调用glGetIntegerv函数并传入GL_MAX_TEXTURE_SIZE参数,可以得到系统能够处理的最大纹理尺寸。
部署运行你感兴趣的模型镜像
GLint maxTextureSize;
glGetIntegerv(GL_MAX_TEXTURE_SIZE,&maxTextureSize);

获取最大纹理大小。

您可能感兴趣的与本文相关的镜像

Qwen-Image-Edit-2509

Qwen-Image-Edit-2509

图片编辑
Qwen

Qwen-Image-Edit-2509 是阿里巴巴通义千问团队于2025年9月发布的最新图像编辑AI模型,主要支持多图编辑,包括“人物+人物”、“人物+商品”等组合玩法

//实验3 - 1第1题 #include <glad/glad.h> #include <GLFW/glfw3.h> #include <glm/glm.hpp> #include <glm/gtc/matrix_transform.hpp> #include <iostream> #include "Shader.h" #include <glm/gtc/matrix_transform.hpp> #include <glm/gtc/type_ptr.hpp> //加载纹理数据需要的头文件 #define STB_IMAGE_IMPLEMENTATION #include <SOIL2/SOIL2.h> //文件图像加载库 // 添加头文件 #ifdef _WIN32 #include <direct.h> // Windows 上使用 _getcwd #else #include <unistd.h> // Linux/macOS 使用 getcwd #endif void framebuffer_size_callback(GLFWwindow* window, int width, int height); void processInput(GLFWwindow* window); void init(); void render(); void cleanUp(); const unsigned int SCR_WIDTH = 800; const unsigned int SCR_HEIGHT = 600; unsigned int texture1, texture2; unsigned int VBO, VAO, EBO; GLFWwindow* window = NULL; Shader* ourShader = NULL; int main() { char buffer[1024]; if (_getcwd(buffer, sizeof(buffer)) != nullptr) { std::cout << "Current working directory: " << buffer << std::endl; } else { std::cout << "Failed to get current working directory!" << std::endl; } glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); #ifdef __APPLE__ glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // uncomment this statement to fix compilation on OS X #endif //创建GLFW窗口对象 window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "Lab3-1:3", NULL, NULL); if (window == NULL) { std::cout << "Failed to create GLFW window" << std::endl; glfwTerminate(); return -1; } glfwMakeContextCurrent(window); glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); //加载glad库 if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { std::cout << "Failed to initialize GLAD" << std::endl; return -1; } init(); //调用自定义的初始化函数 while (!glfwWindowShouldClose(window)) //窗口消息循环 { processInput(window); //窗口消息处理 render(); //调用自定义的渲染函数 glfwPollEvents(); //窗口消息轮询 glfwSwapBuffers(window); //窗口缓冲区交换 } cleanUp(); //调用自定义的资源释放函数 glfwTerminate(); //窗口销毁 return 0; } void init() { float vertices[] = { //位置 // 颜色 // 纹理坐标 0.5f, -0.5f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, // 右下 0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, // 右上 -0.5f, -0.5f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, // 左下 -0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f // 左上 }; unsigned int indices[] = { //EBO索引 0, 3, 1, // first triangle 1, 3, 2 // second triangle }; //创建VAO,VBO,EBO对象 glGenVertexArrays(1, &VAO); glGenBuffers(1, &VBO); glGenBuffers(1, &EBO); //绑定VAO,VBO,EBO对象,并拷贝数据 glBindVertexArray(VAO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); //顶点位置属性 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); //顶点颜色属性 glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float))); glEnableVertexAttribArray(1); //顶点纹理坐标属性 glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float))); glEnableVertexAttribArray(2); //加载纹理1 glGenTextures(1, &texture1); glBindTexture(GL_TEXTURE_2D, texture1); //将纹理环绕设置为 GL_REPEAT glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); //将纹理过滤设置为 GL_LINEAR glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //加载并生成纹理 int width, height, nrChannels; unsigned char* data = SOIL_load_image("lab3-1-3-1.jpg", &width, &height, &nrChannels, SOIL_LOAD_AUTO); if (data) { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data); } else { std::cout << "Failed to load texture" << std::endl; } //释放图像的内存 SOIL_free_image_data(data); //加载纹理2 glGenTextures(1, &texture2); glBindTexture(GL_TEXTURE_2D, texture2); //将纹理环绕设置为 GL_REPEAT glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); //将纹理过滤设置为 GL_LINEAR glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 3); //加载并生成纹理 data = SOIL_load_image("lab3-1-3-2.png", &width, &height, &nrChannels, SOIL_LOAD_AUTO); if (data) { //PNG图片有透明通道,所以纹理格式要设置为GL_RGBA glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); glGenerateMipmap(GL_TEXTURE_2D); } else { std::cout << "Failed to load texture" << std::endl; } //释放图像的内存 SOIL_free_image_data(data); //glGenerateMipmap(GL_TEXTURE_2D); //创建着色器对象 ourShader = new Shader("lab3-1-3.vs", "lab3-1-3.fs"); //注意着色器文件路径 ourShader->use(); // 使用着色器程序 ourShader->setInt("texture1", 0); //设置uniform采样器 ourShader->setInt("texture2", 1); } void cleanUp() //释放资源 { glDeleteVertexArrays(1, &VAO); glDeleteBuffers(1, &VBO); glDeleteBuffers(1, &EBO); glDeleteTextures(1, &texture1); glDeleteTextures(1, &texture2); if (ourShader) { delete ourShader; } } void render() { glClearColor(0.2f, 0.3f, 0.3f, 1.0f); //窗口背景色 glClear(GL_COLOR_BUFFER_BIT); //清除窗口颜色缓冲 glActiveTexture(GL_TEXTURE0); //激活纹理单元0 glBindTexture(GL_TEXTURE_2D, texture1); //绑定纹理1 glActiveTexture(GL_TEXTURE1); //激活纹理单元1 glBindTexture(GL_TEXTURE_2D, texture2); //绑定纹理2 //激活着色器 glm::mat4 transform = glm::mat4(1.0f); //变换 transform = glm::scale(transform, glm::vec3(0.7f)); transform = glm::translate(transform, glm::vec3(-0.2f, -0.4f, 0.0f)); transform = glm::rotate(transform, (float)glfwGetTime() * glm::radians(45.0f), glm::vec3(0.0f, 0.0f, 1.0f)); unsigned int transformLoc = glGetUniformLocation(ourShader->ID, "transform"); glUniformMatrix4fv(transformLoc, 1, GL_FALSE, &transform[0][0]); glBindVertexArray(VAO); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } void processInput(GLFWwindow* window) { if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) glfwSetWindowShouldClose(window, true); } void framebuffer_size_callback(GLFWwindow* window, int width, int height) { //设置视口大小与窗口尺寸匹配 glViewport(0, 0, width, height); } 详细解释每一行代码
最新发布
10-23
#define GLM_ENABLE_EXPERIMENTAL #include <GL/glew.h> #include <GLFW/glfw3.h> #include <SOIL2/soil2.h> #include <string> #include <iostream> #include <fstream> #include <cmath> #include <glm/glm.hpp> #include <glm/gtc/type_ptr.hpp> // glm::value_ptr #include <glm/gtc/matrix_transform.hpp> // glm::translate, glm::rotate, glm::scale, glm::perspective #include <glm/gtx/euler_angles.hpp> #include "Utils.h" using namespace std; Utils::Utils() {} void Utils::displayComputeShaderLimits() { int work_grp_cnt[3]; int work_grp_siz[3]; int work_grp_inv; glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 0, &work_grp_cnt[0]); glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 1, &work_grp_cnt[1]); glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 2, &work_grp_cnt[2]); glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_SIZE, 0, &work_grp_siz[0]); glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_SIZE, 1, &work_grp_siz[1]); glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_SIZE, 2, &work_grp_siz[2]); glGetIntegerv(GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS, &work_grp_inv); printf("maximum number of workgroups is: %i %i %i\n", work_grp_cnt[0], work_grp_cnt[1], work_grp_cnt[2]); printf("maximum size of workgroups is: %i %i %i\n", work_grp_siz[0], work_grp_siz[1], work_grp_siz[2]); printf("max local work group invocations %i\n", work_grp_inv); } string Utils::readShaderFile(const char* filePath) { string content; ifstream fileStream(filePath, ios::in); if (!fileStream.is_open()) { throw "Unable to open file."; } string line = ""; while (!fileStream.eof()) { getline(fileStream, line); content.append(line + "\n"); } fileStream.close(); return content; } bool Utils::checkOpenGLError() { bool foundError = false; int glErr = glGetError(); while (glErr != GL_NO_ERROR) { cout << "glError: " << glErr << endl; foundError = true; glErr = glGetError(); } return foundError; } void Utils::printShaderLog(GLuint shader) { int len = 0; int chWrittn = 0; char* log; glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len); if (len > 0) { log = (char*)malloc(len); glGetShaderInfoLog(shader, len, &chWrittn, log); cout << "Shader Info Log: " << log << endl; free(log); } } GLuint Utils::prepareShader(int shaderTYPE, const char* shaderPath) { GLint shaderCompiled; string shaderStr = readShaderFile(shaderPath); const char* shaderSrc = shaderStr.c_str(); GLuint shaderRef = glCreateShader(shaderTYPE); if (shaderRef == 0 || shaderRef == GL_INVALID_ENUM) { printf("Error: Could not create shader \"%s\" of type:%d\n", shaderPath, shaderTYPE); return 0; } glShaderSource(shaderRef, 1, &shaderSrc, NULL); glCompileShader(shaderRef); checkOpenGLError(); glGetShaderiv(shaderRef, GL_COMPILE_STATUS, &shaderCompiled); if (shaderCompiled != GL_TRUE) { if (shaderTYPE == GL_VERTEX_SHADER) cout << "Vertex "; if (shaderTYPE == GL_TESS_CONTROL_SHADER) cout << "Tess Control "; if (shaderTYPE == GL_TESS_EVALUATION_SHADER) cout << "Tess Eval "; if (shaderTYPE == GL_GEOMETRY_SHADER) cout << "Geometry "; if (shaderTYPE == GL_FRAGMENT_SHADER) cout << "Fragment "; if (shaderTYPE == GL_COMPUTE_SHADER) cout << "Compute "; cout << "shader compilation error for shader: '" << shaderPath << "'." << endl; printShaderLog(shaderRef); } //==================================== // Custom Compilation Error Checking //==================================== //checkOpenGLError(); /*GLint compiled; glGetShaderiv(shaderRef, GL_COMPILE_STATUS, &compiled); if (compiled != GL_TRUE) { printf("Error: Failed to compile shader \"%s\".\n", shaderPath); GLint log_size = 0; glGetShaderiv(shaderRef, GL_INFO_LOG_LENGTH, &log_size); printf("Shader log length: %d\n", log_size); GLchar* info_log = (GLchar*)malloc(sizeof(GLchar)*log_size); glGetShaderInfoLog(shaderRef, log_size, &log_size, info_log); printf("Compilation Log: '%s'\n", info_log); printf("First 5 chars: %d %d %d %d %d\n", info_log[0], info_log[1], info_log[2], info_log[3], info_log[4]); free(info_log); glDeleteShader(shaderRef); return 0; }*/ //==================================== return shaderRef; } void Utils::printProgramLog(int prog) { int len = 0; int chWrittn = 0; char* log; glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &len); if (len > 0) { log = (char*)malloc(len); glGetProgramInfoLog(prog, len, &chWrittn, log); cout << "Program Info Log: " << log << endl; free(log); } } int Utils::finalizeShaderProgram(GLuint sprogram) { GLint linked; glLinkProgram(sprogram); checkOpenGLError(); glGetProgramiv(sprogram, GL_LINK_STATUS, &linked); if (linked != 1) { cout << "linking failed" << endl; printProgramLog(sprogram); } return sprogram; } GLuint Utils::createShaderProgram(const char* cp) { GLuint cShader = prepareShader(GL_COMPUTE_SHADER, cp); GLuint cprogram = glCreateProgram(); glAttachShader(cprogram, cShader); finalizeShaderProgram(cprogram); return cprogram; } GLuint Utils::createShaderProgram(const char* vp, const char* fp) { GLuint vShader = prepareShader(GL_VERTEX_SHADER, vp); GLuint fShader = prepareShader(GL_FRAGMENT_SHADER, fp); GLuint vfprogram = glCreateProgram(); glAttachShader(vfprogram, vShader); glAttachShader(vfprogram, fShader); finalizeShaderProgram(vfprogram); return vfprogram; } GLuint Utils::createShaderProgram(const char* vp, const char* gp, const char* fp) { GLuint vShader = prepareShader(GL_VERTEX_SHADER, vp); GLuint gShader = prepareShader(GL_GEOMETRY_SHADER, gp); GLuint fShader = prepareShader(GL_FRAGMENT_SHADER, fp); GLuint vgfprogram = glCreateProgram(); glAttachShader(vgfprogram, vShader); glAttachShader(vgfprogram, gShader); glAttachShader(vgfprogram, fShader); finalizeShaderProgram(vgfprogram); return vgfprogram; } GLuint Utils::createShaderProgram(const char* vp, const char* tCS, const char* tES, const char* fp) { GLuint vShader = prepareShader(GL_VERTEX_SHADER, vp); GLuint tcShader = prepareShader(GL_TESS_CONTROL_SHADER, tCS); GLuint teShader = prepareShader(GL_TESS_EVALUATION_SHADER, tES); GLuint fShader = prepareShader(GL_FRAGMENT_SHADER, fp); GLuint vtfprogram = glCreateProgram(); glAttachShader(vtfprogram, vShader); glAttachShader(vtfprogram, tcShader); glAttachShader(vtfprogram, teShader); glAttachShader(vtfprogram, fShader); finalizeShaderProgram(vtfprogram); return vtfprogram; } GLuint Utils::createShaderProgram(const char* vp, const char* tCS, const char* tES, char* gp, const char* fp) { GLuint vShader = prepareShader(GL_VERTEX_SHADER, vp); GLuint tcShader = prepareShader(GL_TESS_CONTROL_SHADER, tCS); GLuint teShader = prepareShader(GL_TESS_EVALUATION_SHADER, tES); GLuint gShader = prepareShader(GL_GEOMETRY_SHADER, gp); GLuint fShader = prepareShader(GL_FRAGMENT_SHADER, fp); GLuint vtgfprogram = glCreateProgram(); glAttachShader(vtgfprogram, vShader); glAttachShader(vtgfprogram, tcShader); glAttachShader(vtgfprogram, teShader); glAttachShader(vtgfprogram, gShader); glAttachShader(vtgfprogram, fShader); finalizeShaderProgram(vtgfprogram); return vtgfprogram; } GLuint Utils::loadCubeMap(const char* mapDir) { GLuint textureRef; string xp = mapDir; xp = xp + "/xp.jpg"; string xn = mapDir; xn = xn + "/xn.jpg"; string yp = mapDir; yp = yp + "/yp.jpg"; string yn = mapDir; yn = yn + "/yn.jpg"; string zp = mapDir; zp = zp + "/zp.jpg"; string zn = mapDir; zn = zn + "/zn.jpg"; textureRef = SOIL_load_OGL_cubemap(xp.c_str(), xn.c_str(), yp.c_str(), yn.c_str(), zp.c_str(), zn.c_str(), SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS); if (textureRef == 0) cout << "didnt find cube map image file" << endl; // glBindTexture(GL_TEXTURE_CUBE_MAP, textureRef); // reduce seams // glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); // glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); return textureRef; } GLuint Utils::loadTexture(const char* texImagePath) { GLuint textureRef; textureRef = SOIL_load_OGL_texture(texImagePath, SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y); if (textureRef == 0) cout << "didnt find texture file " << texImagePath << endl; // ----- mipmap/anisotropic section glBindTexture(GL_TEXTURE_2D, textureRef); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glGenerateMipmap(GL_TEXTURE_2D); if (glewIsSupported("GL_EXT_texture_filter_anisotropic")) { GLfloat anisoset = 0.0f; glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &anisoset); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, anisoset); } // ----- end of mipmap/anisotropic section return textureRef; } // GOLD material - ambient, diffuse, specular, and shininess float* Utils::goldAmbient() { static float a[4] = { 0.2473f, 0.1995f, 0.0745f, 1 }; return (float*)a; } float* Utils::goldDiffuse() { static float a[4] = { 0.7516f, 0.6065f, 0.2265f, 1 }; return (float*)a; } float* Utils::goldSpecular() { static float a[4] = { 0.6283f, 0.5559f, 0.3661f, 1 }; return (float*)a; } float Utils::goldShininess() { return 51.2f; } // SILVER material - ambient, diffuse, specular, and shininess float* Utils::silverAmbient() { static float a[4] = { 0.1923f, 0.1923f, 0.1923f, 1 }; return (float*)a; } float* Utils::silverDiffuse() { static float a[4] = { 0.5075f, 0.5075f, 0.5075f, 1 }; return (float*)a; } float* Utils::silverSpecular() { static float a[4] = { 0.5083f, 0.5083f, 0.5083f, 1 }; return (float*)a; } float Utils::silverShininess() { return 51.2f; } // BRONZE material - ambient, diffuse, specular, and shininess float* Utils::bronzeAmbient() { static float a[4] = { 0.2125f, 0.1275f, 0.0540f, 1 }; return (float*)a; } float* Utils::bronzeDiffuse() { static float a[4] = { 0.7140f, 0.4284f, 0.1814f, 1 }; return (float*)a; } float* Utils::bronzeSpecular() { static float a[4] = { 0.3936f, 0.2719f, 0.1667f, 1 }; return (float*)a; } float Utils::bronzeShininess() { return 25.6f; } 为什么我把这一段: if (!fileStream.is_open()) { throw "Unable to open file."; } 删掉就不会报错但是屏幕变成白色卡住
08-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值