Skip to content

Commit

Permalink
smooth sphere shading + minor style corrections
Browse files Browse the repository at this point in the history
  • Loading branch information
denizdiktas committed Jun 9, 2023
1 parent d4ee1bb commit 0712485
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 64 deletions.
90 changes: 38 additions & 52 deletions Arrangement_on_surface_2/demo/earth/mainwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,18 @@ namespace {
#version 330
layout (location = 0) in vec3 pos;
layout (location = 1) in vec3 normal;
//out vec4 vCol;
out vec3 vpos;
//out vec3 vpos;
out vec3 vNormal;
uniform mat4 MVP;
void main()
{
vpos = pos;
//vpos = pos;
vNormal = normal;
gl_Position = MVP * vec4(pos.xyz, 1);
//gl_Position = vec4(pos.xyz, 1);
}
Expand Down Expand Up @@ -62,13 +66,22 @@ void main()
static const char* fragment_shader_code = R"fs(
#version 330
in vec4 vCol;
//in vec4 vCol;
in vec3 vNormal;
out vec4 color;
void main()
{
const vec3 lightDir = normalize(vec3(1,.5,.5));
//float c = clamp(dot(lightDir,triNormal), 0, 1);
vec3 n = normalize(vNormal);
float c = abs( dot(lightDir, n) );
color = vec4(.2, .2,0,1) + vec4(c,c,0,1);
//color = vec4(1,1,0,1);
color = vCol;
//color = vCol;
}
)fs";
}
Expand Down Expand Up @@ -135,9 +148,8 @@ void MainWidget::initializeGL()

glClearColor(0, 0, 0, 1);

//initGeometry();
createSphere(20, 10, 3);
initShaderProgram();
init_geometry();
init_shader_program();

// Enable depth buffer
glEnable(GL_DEPTH_TEST);
Expand All @@ -149,7 +161,7 @@ void MainWidget::initializeGL()
m_timer.start(12, this);
}

void MainWidget::addShader(GLuint the_program, const char* shader_code,
void MainWidget::add_shader(GLuint the_program, const char* shader_code,
GLenum shader_type)
{
GLuint the_shader = glCreateShader(shader_type);
Expand Down Expand Up @@ -181,7 +193,7 @@ void MainWidget::addShader(GLuint the_program, const char* shader_code,

glAttachShader(the_program, the_shader);
}
void MainWidget::initShaderProgram()
void MainWidget::init_shader_program()
{
shader = glCreateProgram();
if (!shader)
Expand All @@ -190,9 +202,9 @@ void MainWidget::initShaderProgram()
return;
}

addShader(shader, vertex_shader_code, GL_VERTEX_SHADER);
addShader(shader, geometry_shader_code, GL_GEOMETRY_SHADER);
addShader(shader, fragment_shader_code, GL_FRAGMENT_SHADER);
add_shader(shader, vertex_shader_code, GL_VERTEX_SHADER);
//add_shader(shader, geometry_shader_code, GL_GEOMETRY_SHADER);
add_shader(shader, fragment_shader_code, GL_FRAGMENT_SHADER);

GLint result = 0;
GLchar elog[1024] = { 0 };
Expand Down Expand Up @@ -221,41 +233,15 @@ void MainWidget::initShaderProgram()



void MainWidget::initGeometry()
void MainWidget::init_geometry()
{
const float c = 0.5;
GLfloat vertices[] = {
-c, -c, 0,
c, -c, 0,
0, c, 0
};

GLuint indices[] = { 0,1,2 };

glGenVertexArrays(1, &m_vao);
glBindVertexArray(m_vao);
{
glGenBuffers(1, &m_ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

glGenBuffers(1, &m_vbo);
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
{
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

GLint index = 0;
glVertexAttribPointer(index, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(index);
}
glBindBuffer(GL_ARRAY_BUFFER, 0);

}
glBindVertexArray(0);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
int num_slices, num_stacks;
num_slices = num_stacks = 64;
float r = 3;
create_sphere(num_slices, num_stacks, r);
}
void MainWidget::createSphere(int num_slices, int num_stacks, float r)

void MainWidget::create_sphere(int num_slices, int num_stacks, float r)
{
num_stacks = std::max<int>(2, num_stacks);
std::vector<QVector3D> vertices, normals;
Expand Down Expand Up @@ -424,15 +410,15 @@ void MainWidget::createSphere(int num_slices, int num_stacks, float r)

void MainWidget::resizeGL(int w, int h)
{
// Calculate aspect ratio
qreal aspect = qreal(w) / qreal(h ? h : 1);
// Calculate aspect ratio
qreal aspect = qreal(w) / qreal(h ? h : 1);

// near and far plane locations and vertical field-of-view angle in degrees
const qreal z_near = 1.0, z_far = 100.0, fov = 45.0;
// near and far plane locations and vertical field-of-view angle in degrees
const qreal z_near = 1.0, z_far = 100.0, fov = 45.0;

// Reset projection
m_projection.setToIdentity();
m_projection.perspective(fov, aspect, z_near, z_far);
// Reset projection
m_projection.setToIdentity();
m_projection.perspective(fov, aspect, z_near, z_far);
}

void MainWidget::paintGL()
Expand Down
27 changes: 15 additions & 12 deletions Arrangement_on_surface_2/demo/earth/mainwidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,24 +36,27 @@ class MainWidget : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core
void paintGL() override;


GLuint m_vao, m_vbo, m_ibo, shader, m_num_indices;
GLuint m_uniform_mvp; // uniform location for MVP-matrix in the shader
void addShader(GLuint program, const char* shader_code, GLenum shader_type);
void initShaderProgram();
void add_shader(GLuint the_program,
const char* shader_code,
GLenum shader_type);
void init_shader_program();

void initGeometry();
void createSphere(int num_slices, int num_stacks, float r);
void init_geometry();
void create_sphere(int num_slices, int num_stacks, float r);


private:
QBasicTimer m_timer;
GLuint m_vao, m_vbo, m_ibo, shader, m_num_indices;
GLuint m_uniform_mvp; // uniform location for MVP-matrix in the shader

QBasicTimer m_timer;

QMatrix4x4 m_projection;
QMatrix4x4 m_projection;

QVector2D m_mouse_press_position;
QVector3D m_rotation_axis;
qreal m_angular_speed = 0;
QQuaternion m_rotation;
QVector2D m_mouse_press_position;
QVector3D m_rotation_axis;
qreal m_angular_speed = 0;
QQuaternion m_rotation;
};

#endif // MAINWIDGET_H

0 comments on commit 0712485

Please sign in to comment.