본문 바로가기
Opengles 3.0 with Android

Chapter 6.4 Polka Dot

by SimonLee 2025. 4. 24.

 

728x90

 

 

char LightPosition    = ProgramManagerObj->ProgramGetUniformLocation(program,(char*)"LightPosView");
char ModelColor        = ProgramManagerObj->ProgramGetUniformLocation(program, (char*)"ModelColor");
char DotColor          = ProgramManagerObj->ProgramGetUniformLocation(program, (char*)"DotColor");

char BackSideModelColor = ProgramManagerObj->ProgramGetUniformLocation(program, (char*)"BackSideModelColor");
char BackSideDotColor   = ProgramManagerObj->ProgramGetUniformLocation(program, (char*)"BackSideDotColor");
char DotSize           = ProgramManagerObj->ProgramGetUniformLocation(program, (char*)"DotSize");
char Side               = ProgramManagerObj->ProgramGetUniformLocation(program, (char*)"Side");

if (DotColor >= 0){
    glUniform3f(DotColor, 0.4, 0.5, 1.0 );
}

if (BackSideModelColor >= 0){
    glUniform3f(BackSideModelColor, 0.0, 1.0, 0.0 );
}

if (BackSideDotColor >= 0){
    glUniform3f(BackSideDotColor, 1.0, 1.0, 1.0 );
}

if ( DotSize >= 0 ){
    glUniform1f(DotSize, 0.13);
}

 

Vertex Shader

#version 300 es
// Vertex information
layout(location = 0) in vec4  VertexPosition;
layout(location = 1) in vec3  Normal;

// Model View Project matrix
uniform mat4    ModelViewProjectionMatrix;
uniform mat3    NormalMatrix;

out vec3    ObjectCoord;

void main() 
{
    ObjectCoord= VertexPosition.xyz;

    gl_Position = ModelViewProjectionMatrix * VertexPosition;
}

Fragment Shader

#version 300 es
precision mediump float;

// 최종 출력 색상 (컬러 버퍼 0번으로 출력)
layout(location = 0) out vec4 outColor;

// 정점 셰이더에서 전달된 오브젝트 공간 좌표
in vec3 ObjectCoord;

// 큐브 셀 한 변의 길이와 도트(구형 점)의 반지름
uniform float Side;
uniform float DotSize;

// 앞면과 뒷면 각각의 배경색과 도트 색
uniform vec3 ModelColor, DotColor;
uniform vec3 BackSideModelColor, BackSideDotColor;

void main() {
    // 셀 하나의 큐브 크기를 정의
    vec3 Cube = vec3(Side, Side, Side);

    // 최종 렌더링 색상을 저장할 변수 초기화 (검정색)
    vec3 RenderColor = vec3(0.0, 0.0, 0.0);

    // 구 안에 들어가는지 판정할 변수와 거리 계산용 변수
    float insideSphere, length;

    // ObjectCoord를 Cube 크기로 나눈 후, 중심 기준으로 위치 계산
    // → 큐브 셀 내부의 상대 좌표를 얻음
    vec3 position = mod(ObjectCoord, Cube) - Cube / 2.0;

    // 거리 계산 (정확히는 구의 반지름 계산용)
    length = sqrt(position.x * position.x + 
                  position.y * position.y + 
                  position.z * position.z);

    // 점(구) 안에 들어가면 1, 아니면 0 (도트 영역 판단)
    insideSphere = step(length, DotSize);

    // 앞면이면 앞면 색상 + 도트 색상 혼합
    if (gl_FrontFacing) {
        RenderColor = mix(ModelColor, DotColor, insideSphere);
    }
    // 뒷면이면 뒷면 색상 + 도트 색상 혼합
    else {
        RenderColor = mix(BackSideModelColor, BackSideDotColor, insideSphere);
    }

    // 최종 색상 출력 (불투명 알파)
    outColor = vec4(RenderColor, 1.0);
}
728x90

'Opengles 3.0 with Android' 카테고리의 다른 글

Chapter 6.3 Pattern Effect - Brick Style  (0) 2025.04.22
Chapter 6.1 Pattern Effect - Circle  (0) 2025.04.16
Chapter 6.0 Warble Effect  (0) 2025.04.16
Chapter 5.2 Multi Light  (0) 2025.04.15
Chapter 5.1 Phong Shader  (0) 2025.03.24