1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
void SliceWidget::initializeGL()
{
makeCurrent();
initializeOpenGLFunctions();
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
Vertex = new QOpenGLShader(QOpenGLShader::Vertex);
Vertex->compileSourceCode(
"#version 450\n"
"layout(location = 0) in vec2 xy;\n"
"layout(location = 1) in vec2 uv;\n"
"out vec2 texCoord;\n"
"void main()"
"{\n"
" texCoord = uv;\n"
" gl_Position = vec4(xy, 0.0f, 1.0f);\n"
"}\n"
);
if (!Vertex->isCompiled())
std::cerr << "[Error] Vertex Shader is not compiled\n";
Fragment = new QOpenGLShader(QOpenGLShader::Fragment);
Fragment->compileSourceCode(
"#version 450\n"
"in vec2 texCoord;\n"
"out vec4 out_color;\n"
"uniform sampler2D tex;\n"
"void main()"
"{\n"
" out_color = texture(tex, texCoord).rgba;\n"
"}\n"
);
if (!Fragment->isCompiled())
std::cerr << "[Error] Fragment Shader is not compiled\n";
Program = new QOpenGLShaderProgram();
Program->addShader(Vertex);
Program->addShader(Fragment);
if (!Program->bind())
std::cerr << "[Error] " << Program->log().toStdString() << '\n';
if (!Vao.create())
std::cerr << "[Error] Vao create() fail\n";
Vao.bind();
glGenTextures(1, &Tex);
glBindTexture(GL_TEXTURE_2D, Tex);
glTexImage2D(GL_TEXTURE_2D, 0,
GL_RGBA,
Fd.width, Fd.height, 0,
GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
glUniform1i(glGetUniformLocation(Program->programId(), "tex"), 0);
glGenerateMipmap(GL_TEXTURE_2D);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glBindTexture(GL_TEXTURE_2D, 0);
cudaGraphicsGLRegisterImage(&cuResource, Tex, GL_TEXTURE_2D,
cudaGraphicsMapFlags::cudaGraphicsMapFlagsNone);
const float data[16] = {
// Top-left
-1.0f, 1.0, //xy coord
0.0f, 0.0f, // uv coord
// Top-right
1.0f, 1.0f,
1.0f, 0.0f,
// Bottom-right
1.0f, -1.0f,
1.0f, 1.0f,
// Bottom-left
-1.0, -1.0,
0.0f, 1.0f
};
glGenBuffers(1, &Vbo);
glBindBuffer(GL_ARRAY_BUFFER, Vbo);
glBufferData(GL_ARRAY_BUFFER, 16 * sizeof(GLfloat), data, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float),
reinterpret_cast<void*>(2 * sizeof(float)));
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
const GLuint elements[6] = {
0, 1, 2,
2, 3, 0
};
glGenBuffers(1, &Ebo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, Ebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6 * sizeof(GLuint), elements, GL_STATIC_DRAW);
Vao.release();
Program->release();
glViewport(0, 0, Width, Height);
doneCurrent();
} |
Partager