| 12
 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