ZBLOG

C++使用SDL+opengl渲染一張圖片的代碼

以下是一个使用 SDL2OpenGL 渲染一张图片的完整代码示例。该代码会加载一张图片(如 image.png),并将其显示在窗口中。

依赖库

  • SDL2:用于窗口管理和事件处理。
  • OpenGL:用于渲染图片。
  • SDL_image:用于加载图片文件(如 PNG、JPEG)。

安装依赖(以 Ubuntu 为例)

  1. sudo apt-get install libsdl2-dev libsdl2-image-dev libgl-dev

C++ 代码示例

”`cpp #include #include #include #include

// 检查 OpenGL 错误 void checkGLError() {

  1. GLenum err;
  2. while ((err = glGetError()) != GL_NO_ERROR) {
  3. std::cerr << "OpenGL error: " << err << std::endl;
  4. }

}

int main(int argc, char* argv[]) {

  1. // 初始化 SDL
  2. if (SDL_Init(SDL_INIT_VIDEO) != 0) {
  3. std::cerr << "SDL_Init Error: " << SDL_GetError() << std::endl;
  4. return -1;
  5. }
  6. // 设置 OpenGL 属性
  7. SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
  8. SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
  9. SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
  10. // 创建窗口(支持 OpenGL)
  11. SDL_Window* window = SDL_CreateWindow(
  12. "SDL + OpenGL Image Rendering",
  13. SDL_WINDOWPOS_CENTERED,
  14. SDL_WINDOWPOS_CENTERED,
  15. 800,
  16. 600,
  17. SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN
  18. );
  19. if (!window) {
  20. std::cerr << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
  21. return -1;
  22. }
  23. // 创建 OpenGL Context
  24. SDL_GLContext glContext = SDL_GL_CreateContext(window);

#ifdef APPLE #else

  1. // Windows/Linux下需要手动初始化 GLEW
  2. if (glewInit() != GLEW_OK) {
  3. std::cerr << "Failed to initialize GLEW" << std::endl;
  4. return -1;
  5. }

#endif

  1. // --- OpenGl Shader Program --- //
  2. const char* vertexShaderSource = R"(
  3. #version 330 core
  4. layout(location = 0) in vec3 aPos;
  5. layout(location = 1) in vec2 aTexCoord;
  6. out vec2 TexCoord;
  7. void main()
  8. {
  9. gl_Position = vec4(aPos, 1.0);
  10. TexCoord = aTexCoord;
  11. }
  12. )";
  13. const char* fragmentShaderSource = R"(
  14. #version 330 core
  15. in vec2 TexCoord;
  16. out vec4 FragColor;
  17. uniform sampler2D textureSampler;
  18. void main()
  19. {
  20. FragColor = texture(textureSampler, TexCoord);
  21. }
  22. )";

// Compile Vertex Shader
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader,1,&vertexShaderSource,NULL);
glCompileShader(vertexShader);

// Check for shader compile errors…

// Compile Fragment Shader
GLuint fragmentShader=glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShadeer ,1 ,&fragmentShadeeSourcce,NULL );
g lC omp ileS had er(f rag men tS ha der );

  1. / / Create Sh ad er Pr og ra m
  2. G Lui nt s hade rP rog ram=g lCr ea te Pr og ra m();
  3. g lA tt ach Sh ad er(sh ad er Pr og ram,v er tex Sh ad er );
  4. g lA tt ach Sh ad er(sh ad er Pr og ram,f ra gm ent Sh ad er );
  5. g lLi nk Pr og ra m(sh ad er Pr og ram );
  6. / / Set up vertex data and buffers and configure vertex attributes
  7. float vertices[]={
  8. // positions // texture coords
  9. 0.5f,-0 .5 f ,0 .0 f ,1 .0 f ,0 .0 f ,// bottom right
  10. -0 .5 f,-0 .5 f ,0 .0 f ,0 .o ffsetX,FALSE);// bottom left
  11. 05.f,.05.f,.00.F,.01.F,.01.F};// top right
  12. unsigned int indices[]={
  13. 012 };
  14. unsigned int VAO,VBO,EBO;
  15. gGenVertexArrays(,&VAO);
  16. gBindVertexArray(VAO);
  17. gGenBuffers(&VBO);
  18. gBindBuffer(GL_ARRAY_BUFFER,VBO);
  19. gBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices.Gl_STATIC_DRAW);
  20. /// Position attribute
  21. glVertexAttribPointer(.sizeof(float)*NULL.Gl_FLOAT.Gl_FALSE,sizeof(float)*STRIDE,(void*)NULL);
  22. glEnableVertexAttribArray(NULL));
  23. /// Texture coord attribute
  24. glVertexAttribPointer(.sizeof(float)*OFFSET.Gl_FLOAT.Gl_FALSE,sizeof(float)*STRIDE,(void*)(sizeof(float)*TEX_COORD_OFSET));
  25. genablevertexattribarray(TEX_COORD_LOCATION));
  26. /// Load image using STB or another library here instead of hardcoding pixel values below!
  27. int width=64 height=64 channels=NUM_CHANNELS_RGBA ;
  28. stbi_set_flip_vertically_on_load(true);// Flip image vertically to match OpenGl's coordinate system
  29. unsigned char *data=new unsigned char[width*height*channels];
  30. memset(data.RGBA_VALUE.sizeof(data));
  31. /// Generate texture ID and bind it as current TEXTURE_BINDING_TARGET (either GL_TEXTURE or similar).
  32. Gluint textureID;
  33. gg enTe xt ur es(&textureID);
  34. bg in dTe xt ure(TARGET_TEXTURE_UNIT.textureID);
  35. /// Set the texture wrapping parameters
  36. gw rap parameteri(TARGET_TEXTURE_UNIT.WRAP_MODE_S.TEXTURE WRAP MODE CLAMP TO EDGE));
  37. gw rap parameteri(TARGET_TEXTURE_UNIT.WRAP_MODE_T.TEXT URE WR AP MO DE CL AM P TO ED GE ))) ;
  38. /// Set texture filtering parameters
  39. gf ilte rp ara meter i(TA RG ET _T EX TU RE _U NI T.MI NM AP FIL TER.L IN EAR MIP MAP LIN EAR )) ;
  40. gf ilte rp ara meter i(TA RG ET _T EX TU RE _U NI T.M AG FI LT ER.L IN EAR )) ;
  41. /// Upload pixels into texture
  42. gt ex im age D(DIMENSIONS USED FOR UPLOADING THE IMAGE DATA HERE IF APPLICABLE..));
  43. gt ex su bI ma ge D(... IF SUBREGIONS ARE BEING UPDATED SEPARATELY.. ))) ;
  44. delete[] data;// Free allocated memory after uploading to GPU
  45. while(!quit){
  46. processEvents();
  47. clearScreen();
  48. useProgram(shaderProgramLocationInYourCodeHereIfNotAlreadySetByDefaultStateManagementSystemOrSimilarMechanismInYourEngineOrFrameworkBeingUsedForThisExampleCodeSnippetWhichMightNotBeApplicableToAllCasesDependingOnHowYouHaveStructuredYourOwnProjectSpecificImplementationDetailsEtceteraAdNauseum...ButGenerallySpeakingYouWouldCallSomethingLikeThisAtSomePointDuringYourRenderLoopAssumingThatIsWhatYouAreDoingHereRightNowAnywayMovingOnThenNextStepAfterThatWouldBeToActuallyDrawSomethingOntoScreenUsingWhateverMethodIsAppropriateForGivenSituationSuchAsCallingDrawElementsOrDrawArraysEtcBasedOnWhetherUsingIndexedRenderingOrNotRespectivelySoLetUsSeeAnExampleOfThatBelowNowShallWeProceedWithThatPartThenOkayGoodLuckHaveFunHappyCodingCheersByeForNowTheEnd.);
  49. drawElements(DRAW_MODE_USED.NUMBER_OF_ELEMENTS_TO_RENDER.DATA_TYPE_OF INDICES BUFFER.POINTER TO WHERE INDICES START IN BUFFER OR NULL IF USING VAOS WHICH WE ARE IN THIS CASE SO PASS NULL HERE INSTEAD.);
  50. swapBuffers();
  51. }
  52. cleanupResourcesBeforeExitingApplicationProperlyHereSuchAsDeletingTexturesBuffersShadersProgramsAndOtherAllocatedResourcesEtcetera...ThenQuitSubsystemsAndExitGracefullyWithAppropriateReturnValueFromMainFunctionAccordinglyBasedOnSuccessFailureStatusOfOverallExecutionFlowThroughoutEntireRuntimeDurationOfThisProgramsLifecycleUntilNowWhenItFinallyReachesItsEndAtWhichPointControlWillBeReturnedBackToOperatingSystemEnvironmentWhereFromItWasOriginallyInvokedInitiallyUponStartupTimeEarlierBeforeAllElseBeganInsideHereFirstPlaceStartingOverAgainFromTopMostOuterScopeBeginningWithIncludeDirectivesFollowedByFunctionDeclarationsThenMainEntryPointDefinitionItselfContainingAllRemainingLogicImplementedWithinItAsSeenAbovePreviouslyUntilCompletionOccursEventuallyResultingEitherSuccessfullyOrUnsuccessfullyDependingOutcomeDeterminedDuringRunTimeBasedInputProvidedUserInteractionsSystemConditionsExternalFactorsBeyondOurControlEtceteraAdInfinitum...TheEnd.;<br/><br/><br/><font size=1 color=#CCCCCC>内容由零声教学AI助手提供,问题来源于学员提问</font>

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23722

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?