- 2022.03.28 Monday
- スポンサーサイト
-
一定期間更新がないため広告を表示しています
- | スポンサードリンク | - | | - | - | pookmark |
- 2015.10.29 Thursday
- Shader Lab の勉強
-
これは
http://docs.unity3d.com/Manual/SL-AlphaTest.html
の下から抜粋したソースを解説していきます。
シェーダーの処理順
Shader "Vegetation" {
Properties {//インスペクタで変更できるプロパティ
//_Color(デフォルト白),
_Color ("Main Color", Color) = (1, 1, 1, 1)//_MainTex(画像を設定できるように),
_MainTex ("Base (RGB) Alpha (A)", 2D) = "white" {}
//_MainTex ("Base", 2D) = "white" {}//_Cutoff(切り捨てるの値),
_Cutoff ("Base Alpha cutoff", Range (0,.9)) = .7
}
SubShader {
//つかってない
/*
Tags {
"Queue" = "Transparent"
"RenderType" = "TransparentCutout"
"Projector" = "False"
}
*/
//ライトの影響を受けない
Lighting Off
// Render both front and back facing polygons. 前面と背面に面したポリゴンの両方をレンダリングします。
Cull Off
/*
CGPROGRAM //シェーダをこの範囲に書きますよ〜 はじめ
//SubShaderがサーフェイスシェーダである事をUnityに教える必要があります。//そのために、SubShader内のおまじないの間に次のような#pragmaディレクティブを記述します
//#pragma surface surfaceFunction lightModel [optionalparams]
//#pragma surface と記述すると、UnityはそのSubShaderがサーフェイスシェーダであると認識します。
//続くsurfaceFunctionにはシェーダのエントリ関数名を記述します。
lightModelはサーフェイスシェーダでのライティングの仕方を指定します。
//これには"Lambert"もしくは"BlinnPhong"という指定、もしくはカスタムライティングを指定できます。
//LambertはDiffuse(拡散反射光)のライティングモデル、BlinnPhongはSpecular(鏡面反射光)の代表的なモデルです。- //lightModel - 使用するライティングモデル。
- //組み込みライティングモデルは、
Lambert
(デフューズ) とBlinnPhong
(スペキュラ) です。 - //自前のライティングモデルを記述する方法に関しては、Custom Lighting Models ページを参照してください。
//[optionalparam]には、そのサーフェイスシェーダについてさらに細かい指定ができるのですが…沢山あり
//alphaまたはalpha: - 物理ベースの照明機能のための:簡単な照明機能のための、
//および(premulアルファと同じ)あらかじめ乗算透明オート(フェードアルファと同じ)フェードイン透明度を選択します。
//alpha:fade - 伝統的なフェード・透明性を有効にします。
//alpha:premul - 乗算済みアルファ透明度を有効にします。
#pragma surface surf Lambert alpha //SubShaderがサーフェイスシェーダであると認識させ、ランバートはDiffuse(拡散反射光)のライティングモデル+透明なマテリアル//コンピュート シェーダ でのテクスチャ サンプラ
// テクスチャおよびサンプラはUnityで別オブジェクトではないため、コンピュート シェーダ で使用するためには Unity 特有のルールに従う必要があります:// ネーミングについて、テクスチャ名と同じ名前にするか、
// または "sampler" を名前の始めに付与した名前 (例えば Texture2D MyTexの場合、 SamplerState samplerMyTex) のいずれかにします。
// さらには、"定義済み" のサンプラを使用します。// 名前は、 "Linear" または "Point" (フィルタモードとして)、 かつ、 "Clamp" または "Repeat" (Wrapモードとして) 、をつける必要があります。
// 例えば "SamplerState MyLinearClampSampler" - これにより フィルタとして Linear 、かつ、 Wrapモードとして Clamp が使用されます。
sampler _MainTex;//テクスチャ名と同名のサンプラ変数を一つ定義
struct Input {
float2 uv_Tex;//float2 としてuv_Texを宣言しています。
float4 vtxColor : COLOR;// バーテックス頂点カラーはfloat4型の変数名にセマンティクス「COLOR」を付けると取得できます。
};
////#pragma surface と記述すると必要になるパラメーター:- //surfaceFunction - Cg で記述された Surface Shaders の関数です。
- //これは、
void surf (Input IN, inout SurfaceOutput o)
という関数を持つことを意味します。 - //ここの Input は前もって定義した構造体になります。
- //Input は、surface 関数が必要とするテクスチャ座標と追加の自動変数を含む必要があります。
-
void surf( Input IN, inout SurfaceOutput o ) {
// half4 color = tex2D( _MainTex, IN.uv_Tex );// サーフェイスシェーダ内でtex2D関数を使う
// o.Albedo = color.rgb;//テクスチャからうけたRGBをアルベドにセットします。
// o.Alpha = color.a;//テクスチャからうけたAlpha
}
ENDCG//シェーダをこの範囲に書きますよ〜終わり
*/
// first pass:
// render any pixels that are more than [_Cutoff] opaque
Pass {//Pass ブロックはオブジェクト形状を一回のみレンダリングするようにします。
Color [_Color]//カラーにインスペクタの[_Color]値を与える。
AlphaTest Greater [_Cutoff] //Greater ピクセルのアルファ値が AlphaValue[_Cutoff] より大きい場合のみレンダリング。
//Blend SrcAlpha OneMinusSrcColor
//combine合成の計算式はカラーの RGB およびアルファを計算するのに使用されます。任意のオプションで、アルファの計算に別の計算式を指定できます。//Primary は lighting calculation の色または bound である場合は頂点カラーです。
//Texture は SetTexture で指定された TextureName] です。(上を参照してください。)
SetTexture [_MainTex] {
combine texture * primary, texture //src1 と src2 を乗算。結果はどちらの入力よりも暗くなります。
}
}
// Second pass:
// render in the semitransparent details.
Pass {//Pass ブロックはオブジェクト形状を一回のみレンダリングするようにします。
Color [_Color]
// ZWrite off は Dont write to the depth buffer デプスバッファを描画しない。//このオブジェクトのピクセルをデプスバッファに書き込みするか制御(デフォルトは On )。
//もし不透明なオブジェクトを描画する場合、オンにします。もし部分的に透過のエフェクトを描く場合、
//ZWrite Off に切り替えます。詳細については以下を参照してください。
ZWrite off
//ZTest Less は Don't write pixels we have already written. Pixcelは描画しない、すでに書き込まれているから。//ZWriteデプステストの実行方法。デフォルトは LEqual (すでに描画されているオブジェクトと距離が等しいか、
//より近い場合に描画します、それより遠い場合はオブジェクトで隠します)
ZTest Less //Less なのでZTestも描画もしないです。
// AlphaTest LEqual [_Cutoff] は Only render pixels less or equal to the value より小さいか等しい場合のみレンダリング
//LEqual ピクセルのアルファ値が AlphaValue より小さいか等しい場合のみレンダリング。
AlphaTest LEqual [_Cutoff]
// Set up alpha blending
Blend SrcAlpha OneMinusSrcAlpha //一般的なアルファブレンド
SetTexture [_MainTex] {
combine texture * primary, texture
}
}
}
} - | whaison | Unity3d | 18:26 | comments(0) | - | pookmark |
- 2015.10.26 Monday
- Mac OS X 10.10.4でOpenGLのプログラムを始める方法
-
Mac OS X 10.10.4
Xcode_7_beta_4.
OS X >Applacation >CommandLineTool
適当に設定
Build Phasesで Link Binary With Librariesの+を押す
OpenGLと入力すると出てくる。
GLUTと入力すると出てくる。
main.cにOpenGLとGLUTのヘッダを付け加える
OpenGLとGLUTのヘッダは
#include <OpenGL/gl.h>
#include <GLUT/glut.h>
となる。ここはWindowsと異なるので注意。
------------------------------------------------------------//
// main.c
// opengl001
//
// Created by whaison on 2015/10/26.
// Copyright © 2015年 whaison. All rights reserved.
//
#include <OpenGL/gl.h>
#include <GLUT/glut.h>
#include <stdio.h>
int main(int argc, const char * argv[]) {
// insert code here...
printf("Hello, World!¥n");
return 0;
}
-----------------------------------------------------------
ヘッダを付け加えるのは別にmain.cじゃなくてもいいと思うけど、
(例えばmain.hというファイルを作ってそこに書く)
僕はC言語は詳しくないのでこうしています。
これで少なくともコンパイルはできるはずです。
コンソールに「Hello, World!」と表示されるはずです。
これでうまくコンパイルされるなら、
main.cの中で自由にGLUTとOpenGLのライブラリが使えるはずです。
OpenGLのプログラミングに関しては、
例えば以下のページを参考にしてみてください。
GLUTによる「手抜き」OpenGL入門
参考
http://nozawashinichi.sakura.ne.jp/fs/2009/07/macopengl.html
だけじゃつまらないので、ウィンドウを出してみました。
//// main.c
// opengl002
//
// Created by whaison on 2015/10/26.
// Copyright (c) 2015年 whaison. All rights reserved.
//
#include <OpenGL/gl.h>
#include <GLUT/glut.h>
void display(void)
{
}
int main(int argc, const char * argv[]) {
// insert code here...
printf("Hello, World!¥n");
glutInit(&argc, argv);
glutCreateWindow(argv[0]);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
こんなウィンドウがでました!。
ウィンドウ塗りつぶし 太字の部分を追加して。。。#include <GL/glut.h> void display(void) { glClear(GL_COLOR_BUFFER_BIT); glFlush(); } void init(void) { glClearColor(0.0, 0.0, 1.0, 1.0); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA); glutCreateWindow(argv[0]); glutDisplayFunc(display); init(); glutMainLoop(); return 0; }
ウィンドウ塗りつぶしました。
- | whaison | OpenGL,OpenGLES,glsl,DirectX,hlsl,webGL,metal,vulkan | 17:55 | comments(0) | - | pookmark |