From f2d61fc06387ccb22ecb5cb6c42210736ac64c9f Mon Sep 17 00:00:00 2001 From: Sebastian Park Date: Tue, 23 Apr 2024 00:30:37 -0400 Subject: Get ground textures working, but not yet abstracted to the shape class. --- src/glwidget.cpp | 122 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 109 insertions(+), 13 deletions(-) (limited to 'src/glwidget.cpp') diff --git a/src/glwidget.cpp b/src/glwidget.cpp index 263b7dd..472966b 100755 --- a/src/glwidget.cpp +++ b/src/glwidget.cpp @@ -70,12 +70,87 @@ void GLWidget::initializeGL() glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); - // glShadeModel(GL_SMOOTH); +// glShadeModel(GL_SMOOTH); // Initialize shaders m_defaultShader = new Shader(":resources/shaders/shader.vert", ":resources/shaders/shader.frag"); m_pointShader = new Shader(":resources/shaders/anchorPoint.vert", ":resources/shaders/anchorPoint.geom", ":resources/shaders/anchorPoint.frag"); +// m_texture_shader = new Shader(":/resources/shaders/texture.vert", ":/resources/shaders/texture.frag"); + + // INITIALIZE TEXTURE STUFF + + // Prepare filepath + QString kitten_filepath = QString(":/resources/images/kitten.png"); + + // TASK 1: Obtain image from filepath + m_image = QImage(kitten_filepath); + + // TASK 2: Format image to fit OpenGL + m_image = m_image.convertToFormat(QImage::Format_RGBA8888).mirrored(); + + auto bits = m_image.bits(); + + // TASK 3: Generate kitten texture + glGenTextures(1, &m_kitten_texture); + + // TASK 9: Set the active texture slot to texture slot 0 + glActiveTexture(GL_TEXTURE0); + + // TASK 4: Bind kitten texture + glBindTexture(GL_TEXTURE_2D, m_kitten_texture); + + // TASK 5: Load image into kitten texture + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_image.width(), m_image.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, m_image.bits()); + + // TASK 6: Set min and mag filters' interpolation mode to linear + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + // TASK 7: Unbind kitten texture + glBindTexture(GL_TEXTURE_2D, 0); + +// // TASK 10: set the texture.frag uniform for our texture +// glUseProgram(m_texture_shader->id()); +// glUniform1i(glGetUniformLocation(m_texture_shader->id(), "sampler"), 0); +// glUseProgram(0); + + glUseProgram(m_defaultShader->id()); + glUniform1i(glGetUniformLocation(m_defaultShader->id(), "sampler"), 0); + glUseProgram(0); + +// // TASK 11: Fix this "fullscreen" quad's vertex data +// // TASK 12: Play around with different values! +// // TASK 13: Add UV coordinates +// std::vector fullscreen_quad_data = +// { // POSITIONS // UVs // +// -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, +// -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, +// 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, +// 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, +// -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, +// 1.0f, -1.0f, 0.0f, 1.0f, 0.0f +// }; + +// // Generate and bind a VBO and a VAO for a fullscreen quad +// glGenBuffers(1, &m_fullscreen_vbo); +// glBindBuffer(GL_ARRAY_BUFFER, m_fullscreen_vbo); +// glBufferData(GL_ARRAY_BUFFER, fullscreen_quad_data.size()*sizeof(GLfloat), fullscreen_quad_data.data(), GL_STATIC_DRAW); +// glGenVertexArrays(1, &m_fullscreen_vao); +// glBindVertexArray(m_fullscreen_vao); + +// // TASK 14: modify the code below to add a second attribute to the vertex attribute array +// glEnableVertexAttribArray(0); +// glEnableVertexAttribArray(1); +// glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), nullptr); +// glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), reinterpret_cast(3 * sizeof(GLfloat))); + +// // Unbind the fullscreen quad's VBO and VAO +// glBindBuffer(GL_ARRAY_BUFFER, 0); +// glBindVertexArray(0); + + // END INITIALIZE TEXTURE STUFF + // Initialize ARAP, and get parameters needed to decide the camera position, etc Vector3f coeffMin, coeffMax; @@ -111,11 +186,30 @@ void GLWidget::initializeGL() m_arap.initGroundPlane(":resources/images/kitty.png", 2, m_defaultShader); } +//void GLWidget::paintTexture(GLuint texture, bool filtered){ +//// glUseProgram(m_texture_shader->id()); +// m_texture_shader->bind(); +// // TASK 32: Set your bool uniform on whether or not to filter the texture drawn +//// glUniform1i(glGetUniformLocation(m_texture_shader->id(), "filtered"), filtered); +// m_texture_shader->setUniform("filtered", filtered); +// // TASK 10: Bind "texture" to slot 0 +// glActiveTexture(GL_TEXTURE0); +// glBindTexture(GL_TEXTURE_2D, texture); +// glBindVertexArray(m_fullscreen_vao); +//// std::cout << texture << std::endl; +// glDrawArrays(GL_TRIANGLES, 0, 6); +// glBindTexture(GL_TEXTURE_2D, 0); +// glBindVertexArray(0); +// glUseProgram(0); +// m_texture_shader->unbind(); +//} + void GLWidget::paintGL() { - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnable( GL_BLEND ); +// paintTexture(m_kitten_texture, false); +// glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); +// glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +// glEnable( GL_BLEND ); m_defaultShader->bind(); m_defaultShader->setUniform("proj", m_camera.getProjection()); @@ -124,7 +218,9 @@ void GLWidget::paintGL() m_defaultShader->setUniform("inverseView", inverseView); m_defaultShader->setUniform("widthBounds", m_arap.minCorner[0], m_arap.maxCorner[0]); m_defaultShader->setUniform("lengthBounds", m_arap.minCorner[2], m_arap.maxCorner[2]); -// m_defaultShader->setUniform(""); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, m_kitten_texture); m_arap.draw(m_defaultShader, GL_TRIANGLES); m_defaultShader->unbind(); @@ -132,14 +228,14 @@ void GLWidget::paintGL() glClear(GL_DEPTH_BUFFER_BIT); -// m_pointShader->bind(); -// m_pointShader->setUniform("proj", m_camera.getProjection()); -// m_pointShader->setUniform("view", m_camera.getView()); -// m_pointShader->setUniform("vSize", m_vSize); -// m_pointShader->setUniform("width", width()); -// m_pointShader->setUniform("height", height()); -// m_arap.draw(m_pointShader, GL_POINTS); -// m_pointShader->unbind(); +//// m_pointShader->bind(); +//// m_pointShader->setUniform("proj", m_camera.getProjection()); +//// m_pointShader->setUniform("view", m_camera.getView()); +//// m_pointShader->setUniform("vSize", m_vSize); +//// m_pointShader->setUniform("width", width()); +//// m_pointShader->setUniform("height", height()); +//// m_arap.draw(m_pointShader, GL_POINTS); +//// m_pointShader->unbind(); } void GLWidget::resizeGL(int w, int h) -- cgit v1.2.3-70-g09d2