Skip to content

Instantly share code, notes, and snippets.

View dalinaum's full-sized avatar
:octocat:
Learning Rust and IR.

LYK dalinaum

:octocat:
Learning Rust and IR.
View GitHub Profile
#!/usr/bin/perl
use strict;
use FindBin;
BEGIN {
my $env = "$FindBin::Bin/env";
if (-r $env) {
do $env or die $@;
}

저자

[@dalinaum][twitter-dalinaum] - 안드로이드 가이. 최근에는 안드로이드의 3D 그래픽(렌더스크립트, OpenGL ES)에 심취해 있다, dalinaum ad gmail.com

시작하며

많은 애플리케이션은 프레젠테이션 레이어와 핵심 로직의 언어를 분리하고 있습니다. 트위터의 경우에는 핵심 로직을 스칼라로 처리하며 프레젠테이션 부분을 루비 언어로 처리합니다. 안드로이드 플랫폼은 프레젠테이션 레이어를 자바와 XML 파일로 구성하며 성능이 중요한 부분은 C/C++ 언어를 사용하고 있습니다. 앞으로 소프트웨어 개발에 더 다양한 언어 조합이 등장할 것을 어렵지 않게 예상할 수 있습니다. 펄 언어 만으로 되어 있는 단일한 환경에서는 모듈과 함수 호출로서 대부분의 일을 해결할 수 있습니다. 하지만 더 다양한 언어와 다채로운 개발 환경을 조합할 경우 기존의 방법으로 문제를 해결하기는 쉽지 않습니다.

public class SimpleView extends RSSurfaceView {
private RenderScriptGL mRS;
private ScriptC_renderloop mScript;
public SimpleView( Context context ) {
super( context );
initRS();
}
private void initRS() {
#pragma version(1)
#pragma rs java_package_name(jp.flatlib.ap02)
#include "rs_graphics.rsh"
int root()
{
// 배경 지우기
rsgClearColor( 1.0f, 0.5f, 0.0f, 0.0f );
#pragma version(1)
#pragma rs java_package_name(jp.flatlib.ap02)
#include "rs_graphics.rsh"
rs_mesh mesh; // class Mesh
rs_program_vertex vsh; // class ProgramVertex
rs_program_fragment psh; // class ProgramFragment
rs_program_store dsbstate; // class ProgramStore
rs_program_raster rstate; // class ProgramRaster
rs_sampler sampler; // class Sampler
ProgramFragmentFixedFunction.Builder pfb =
new ProgramFragmentFixedFunction.Builder(rs);
pfb.setVaryingColor(true);
rs.bindProgramFragment(pfb.create());
mScript.set_dsbstate( ProgramStore.BLEND_NONE_DEPTH_NONE( mRS ) );
mScript.set_rstate( ProgramRaster.CULL_NONE( mRS ) );
mScript.set_sampler( Sampler.WRAP_LINEAR( mRS ) );
private RenderScriptGL glRenderer; //rendering context
private ScriptField_Point mPoints; //vertices
private ScriptField_VpConsts mVpConsts; //shader constants
...
ProgramVertex.Builder sb = new ProgramVertex.Builder(glRenderer);
String t = "varying vec4 varColor;\n" +
"void main() {\n" +
" vec4 pos = vec4(0.0, 0.0, 0.0, 1.0);\n" +
varying vec4 varColor;
varying vec2 varTex0;
void main() {
gl_Position = UNI_MVP * ATTRIB_position;
gl_PointSize = 1.0;
varColor = ATTRIB_color;
varTex0 = ATTRIB_texture0;
}
Mesh.TriangleMeshBuilder builder= new Mesh.TriangleMeshBuilder( mRS, 2, Mesh.TriangleMeshBuilder.COLOR );
// 4개 정점 정의
builder.setColor( 1f, 0f, 0f, 1f ).addVertex( 0.0f, 0.0f );
builder.setColor( 0f, 1f, 0f, 1f ).addVertex( 200.0f, 0.0f );
builder.setColor( 0f, 0f, 1f, 1f ).addVertex( 0.0f, 200.0f );
builder.setColor( 1f, 1f, 1f, 1f ).addVertex( 200.0f, 200.0f );
// index x 2 정의 (2개 폴리곤)
builder.addTriangle( 0, 2, 1 );
builder.addTriangle( 1, 2, 3 );
// Shader 파일 로드
psh_builder.setShader( LoadResource( mContext, R.raw.mesh2dc_psh ) );
ProgramFragment psh= psh_builder.create();