You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
2.5 KiB

4 years ago
  1. #include "misc.h"
  2. #include <stdio.h>
  3. GLuint CreateBufferObject(GLenum bufferType, GLsizeiptr size, GLenum usage, void * data)
  4. {
  5. GLuint object;
  6. glGenBuffers(1, &object);
  7. glBindBuffer(bufferType, object);
  8. glBufferData(bufferType, size, data, usage);
  9. glBindBuffer(bufferType, 0);
  10. return object;
  11. }
  12. char* LoadFileContent(const char *path) {
  13. FILE* pFile = fopen(path, "rb");
  14. if (pFile) {
  15. fseek(pFile, 0, SEEK_END);
  16. int nLen = ftell(pFile);
  17. char* buffer = nullptr;
  18. if (nLen != 0) {
  19. buffer = new char[nLen + 1];
  20. rewind(pFile);
  21. fread(buffer, nLen, 1, pFile);
  22. buffer[nLen] = '\0';
  23. }
  24. else {
  25. printf("load file %s fail, content is 0\n", path);
  26. }
  27. fclose(pFile);
  28. return buffer;
  29. }
  30. else {
  31. printf("open file %s fail\n", path);
  32. }
  33. fclose(pFile);
  34. return nullptr;
  35. }
  36. GLuint CompileShader(GLenum shaderType, const char * shaderPath)
  37. {
  38. //����shader
  39. GLuint shader = glCreateShader(shaderType);
  40. if (shader == 0) {
  41. printf("glCreateShader false\n");
  42. return 0;
  43. }
  44. //��ȡshader����
  45. const char* shaderCode = LoadFileContent(shaderPath);
  46. if (shaderCode == nullptr) {
  47. printf("load shader code from file: %s false\n", shaderPath);
  48. return 0;
  49. }
  50. //��shader���� ���ڴ洫���Դ�
  51. glShaderSource(shader, 1, &shaderCode, nullptr);
  52. glCompileShader(shader);
  53. GLint compileResult = GL_TRUE;
  54. glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult);
  55. if (compileResult == GL_FALSE) {
  56. char szLog[1024] = { 0 };
  57. GLsizei logLen = 0;//ʵ�ʴ�����־����
  58. glGetShaderInfoLog(shader, 1024, &logLen, szLog);
  59. printf("Compile shader fail error log is : %s \n shader code :\n %s \n ", szLog, shaderCode);
  60. glDeleteShader(shader);
  61. return 0;
  62. }
  63. return shader;
  64. }
  65. /**
  66. * һGPU
  67. */
  68. GLuint CreateGPUProgram(const char* vsShaderPath, const char* fsShaderPath) {
  69. GLuint vsShader = CompileShader(GL_VERTEX_SHADER,vsShaderPath);
  70. GLuint fsShader = CompileShader(GL_FRAGMENT_SHADER,fsShaderPath);
  71. //����program
  72. GLuint program = glCreateProgram();
  73. //����shader
  74. glAttachShader(program, vsShader);
  75. glAttachShader(program, fsShader);
  76. //����
  77. glLinkProgram(program);
  78. //����shader
  79. glDetachShader(program, vsShader);
  80. glDetachShader(program, fsShader);
  81. //ɾ��shader
  82. glDeleteShader(vsShader);
  83. glDeleteShader(fsShader);
  84. //��������
  85. GLint nResult;
  86. glGetProgramiv(program, GL_LINK_STATUS, &nResult);
  87. if (nResult == GL_FALSE) {
  88. char log[1024] = { 0 };
  89. GLsizei writed = 0;
  90. glGetProgramInfoLog(program, 1024, &writed, log);
  91. printf("Create CPU program fail error %s\n", log);
  92. glDeleteProgram(program);
  93. program = 0;
  94. }
  95. return program;
  96. }