opengl

opengl 점찍기 - 배경색상 변경

현구구 2022. 8. 22. 13:22

//배경색 칠하기//////////////////////////////////////////
// sb6.h 헤더 파일을 포함시킨다.
#include <sb7.h>
#include <vmath.h> //수학 함수 해더파일 sin,cos
// sb6::application을 상속받는다.
class my_application : public sb7::application
{
public: //쉐이더 컴파일 과정
	// 렌더링 virtual 함수를 작성해서 오버라이딩한다.

	GLuint compile_shaders(void)
	{
		GLuint vertex_shader;
		vertex_shader = glCreateShader(GL_VERTEX_SHADER); //버텍스 쉐이더 생성

		GLuint fragment_shader;
		fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);//프래그먼트 쉐이더 생성

		GLuint program;
		program = glCreateProgram();//프로그램 생성

		const GLchar* vertex_shader_source[] =
		{
			"#version 430 core\n"
			"void main(void)\n"
			"{\n"
			"gl_Position = vec4(0.0,0.0,0.5,1.0);\n"
			"}\n"
		};
		const GLchar* fragment_shader_source[] =
		{
			""
		};

		glShaderSource(vertex_shader, 1, vertex_shader_source, NULL);
		glShaderSource(fragment_shader, 1, fragment_shader_source, NULL); //쉐이더 소스 연결

		glCompileShader(vertex_shader);
		glCompileShader(fragment_shader); //쉐이더 컴파일

		glAttachShader(program, vertex_shader);
		glAttachShader(program, fragment_shader); //프로그램에 쉐이더 연결

		glLinkProgram(program); //프로그램 링크

		glDeleteShader(vertex_shader);
		glDeleteShader(fragment_shader); //쉐이더 삭제

		return program;
	}
	virtual void startup()
	{
		rendering_program = compile_shaders();//랜더링 프로그램에 위 전체 프로그램 연결
		glGenVertexArrays(1, &vertex_array_object); //vao생성
		glBindVertexArray(vertex_array_object);//vao에 바인드
	}
	virtual void shutdown()
	{
		glDeleteVertexArrays(1, &vertex_array_object);
		glDeleteProgram(rendering_program); //vao,프로그램 삭제
	}
	virtual void render(double currentTime) // = tick함수 무한반복 currentTime -> 1초 / render virtual 로 재정의(override)
	{
		const GLfloat red[] = { (float)sin(currentTime) * 0.5f + 0.5f, (float)cos(currentTime) * 0.5f + 0.5f, 0.0f, 1.0f };
		//static 이면 안됨 색 안바뀜
		glClearBufferfv(GL_COLOR, 0, red);
		//==================================배경 색상 변경==========================
		glUseProgram(rendering_program);

		glPointSize(40.0f);
		glDrawArrays(GL_POINTS, 0, 1);
		//=================================glUseProgram{}glDrawArrays() 형식이어야함==================
	} //모든 OpenGL 함수는 gl 로 시작 
private:
	GLuint rendering_program;
	GLuint vertex_array_object;
};


// DECLARE_MAIN의 하나뿐인 인스턴스
DECLARE_MAIN(my_application) // int main() 대체, class명 삽입

점을 찍을 위치를 지정한다

x y 좌표는 0으로 중앙에 위치하도록 하고 z축은 0.5로 해야 화면상에 노출된다.

render함수안에서 시간마다 값이 바뀌는 인자 currentTime을 사용해 float 배열 red에 변수값이 반복적으로 바뀌도록 하고 이 배열을 glClearBufferfv에 넣어 색이 반복적으로 바뀌도록한다

red 배열의 변수는 순서대로 [r,g,b,a]를 나타낸다 각 변스의 범위는 0.0~1.0 이다

(float)sin(currentTime) * 0.5f + 0.5f 는 0.0~1.0 사이에서 역속적으로 값이 변동한다.

startup에서 변수 rendering_program 에 위의 쉐이더 파일인 compile_shaders() 를 연결하고 

render함수에서 이 프로그램을 사용하도록 한다

점 크기를 설정하는 glPointSize에서 점의 크기를 설정하고

glDrawArrays를 사용하여 점을 그리도록 한다

 

'opengl' 카테고리의 다른 글

opengl 바람개비 보간  (0) 2022.09.06
opengl 삼각형 보간  (0) 2022.08.25
opengl 삼각형 폴리곤 모드 - 테셀레이션, 지오메트리 쉐이더  (0) 2022.08.24
opengl 움직이는 삼각형  (0) 2022.08.23
opengl 삼각형 그리기  (0) 2022.08.22