当前位置: 首页 > wzjs >正文

如何自建网站绿派网站建设

如何自建网站,绿派网站建设,拓者吧室内设计网官网,wordpress 商品模板下载1 简介 RuntimeShader 是 Android 13(T)中新增的特性,用于逐像素渲染界面,它使用 AGSL(Android Graphics Shading Language)编写着色器代码,底层基于 Skia 图形渲染引擎。官方介绍详见 → Runti…

1 简介

        RuntimeShader 是 Android 13(T)中新增的特性,用于逐像素渲染界面,它使用 AGSL(Android Graphics Shading Language)编写着色器代码,底层基于 Skia 图形渲染引擎。官方介绍详见 → RuntimeShader。

        相较于 OpenGL ES,RuntimeShader 具有以下特点。

  • RuntimeShader 中只有片元着色器,没有顶点着色器。
  • RuntimeShader 中用户不用输入顶点数据,简化了输入操作。
  • RuntimeShader 基于 AGSL 语言,OpenGL ES 基于 GLSL 语言。
  • AGSL 中纹理坐标值域与 View 的宽高对应,GLSL 中纹理坐标一般归一化了。

2 对 View 进行二次渲染

        MainActivity.java

package com.zhyan8.shaderdemo;import androidx.appcompat.app.AppCompatActivity;import android.graphics.RenderEffect;
import android.graphics.RuntimeShader;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;import com.zhyan8.shaderdemo.utils.ScreenUtils;
import com.zhyan8.shaderdemo.utils.StringUtils;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);LinearLayout parentView = findViewById(R.id.parent);float[] resolution = ScreenUtils.getScreenSizeF(this);applyRuntimeShader(parentView, resolution);}private void applyRuntimeShader(View view, float[] resolution) {String shaderCode = StringUtils.loadString(this, "shaders/dazzling.agsl");RuntimeShader shader = new RuntimeShader(shaderCode);shader.setFloatUniform("u_resolution", resolution);RenderEffect effect = RenderEffect.createRuntimeShaderEffect(shader, "u_texture");view.setRenderEffect(effect);}
}

        activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"android:orientation="vertical"android:gravity="center"android:background="#FFFFFF"android:id="@+id/parent"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World"android:textSize="60sp"android:textColor="#669933"/></LinearLayout>

        dazzling.agsl

uniform shader u_texture;
uniform vec2 u_resolution;vec4 main(vec2 coords) {vec4 tex = u_texture.eval(coords);vec2 normUV = coords / u_resolution;vec3 color = tex.rgb * vec3(normUV.x, normUV.y, 0.5);return vec4(color, 1.0);
}

        说明:coords 的值域与 View 的宽高对应,并不是归一化的坐标。 

        运行效果如下。

3 通过 Canvas 进行渲染

3.1 简单应用

        MainActivity.java

package com.zhyan8.shaderdemo;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.view.WindowManager;
import android.widget.LinearLayout;import com.zhyan8.shaderdemo.graphics.ShaderView;public class MainActivity extends AppCompatActivity {private ShaderView mShaderView;private LinearLayout mParentView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mParentView = findViewById(R.id.parent);addView();MyRenderer renderer = new MyRenderer(this);mShaderView.setRenderer(renderer);mShaderView.requestRender(true);}private void addView() {mShaderView = new ShaderView(this);WindowManager.LayoutParams lp = new WindowManager.LayoutParams(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);lp.width = WindowManager.LayoutParams.MATCH_PARENT;lp.height = WindowManager.LayoutParams.MATCH_PARENT;mParentView.addView(mShaderView, lp);}
}

        ShaderView.java

package com.zhyan8.shaderdemo.graphics;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RuntimeShader;
import android.os.Handler;
import android.os.Looper;
import android.view.Choreographer;
import android.view.View;/*** 自定义view, 承载渲染环境作用, 类比GLSurfaceView* @author little fat sheep*/
public class ShaderView extends View {private Paint mPaint = new Paint();private Renderer mRenderer;private float[] mResolution;private long mStartTime = 0L;private long mRunTime = 0L;private Choreographer mChoreographer;private Handler mHandler;public ShaderView(Context context) {super(context);mChoreographer = Choreographer.getInstance();mHandler = new Handler(Looper.getMainLooper());}public void setRenderer(Renderer renderer) {this.mRenderer = renderer;RuntimeShader shader = renderer.onSurfaceCreated();mPaint.setShader(shader);mStartTime = System.currentTimeMillis();}public void requestRender() {invalidate();}public void requestRender(long duration) {mHandler.post(() -> {mChoreographer.postFrameCallback(mFrameCallback);});mHandler.postDelayed(() -> {mChoreographer.removeFrameCallback(mFrameCallback);}, duration);}public void requestRender(boolean continuous) {if (continuous) {mChoreographer.postFrameCallback(mFrameCallback);} else {invalidate();}}public void stopRenderer() {mChoreographer.removeFrameCallback(mFrameCallback);}public void stopRenderer(long delay) {mHandler.postDelayed(() -> {mChoreographer.removeFrameCallback(mFrameCallback);}, delay);}@Overridepublic void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);mResolution = new float[] { w, h };mRenderer.onSurfaceChanged(w, h);}@Overridepublic void onDraw(Canvas canvas) {super.onDraw(canvas);mRunTime = System.currentTimeMillis() - mStartTime;mRenderer.onDrawFrame(mRunTime);canvas.drawRect(0f, 0f, mResolution[0], mResolution[1], mPaint);}private Choreographer.FrameCallback mFrameCallback = new Choreographer.FrameCallback() {@Overridepublic void doFrame(long frameTimeNanos) {mChoreographer.postFrameCallback(this);ShaderView.this.invalidate();}};/*** 渲染器接口, 类比GLSurfaceView.Renderer* @author little fat sheep*/public interface Renderer {RuntimeShader onSurfaceCreated();void onSurfaceChanged(int width, int height);void onDrawFrame(long runTime);}
}

        BitmapTexture.java

package com.zhyan8.shaderdemo.graphics;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.RuntimeShader;
import android.graphics.Shader;import com.zhyan8.shaderdemo.utils.BitmapUtils;/*** Bitmap纹理* @author little fat sheep*/
public class BitmapTexture {private BitmapShader mBitmapShader;private float[] mSize;private BitmapTexture(BitmapShader bitmapShader, float[] size) {this.mBitmapShader = bitmapShader;this.mSize = size;}public static BitmapTexture create(Context context, String assetPath) {Bitmap bitmap = BitmapUtils.loadBitmapFromAsset(context, assetPath);return create(bitmap);}public static BitmapTexture create(Context context, int rawId) {Bitmap bitmap = BitmapUtils.loadBitmapFromRaw(context, rawId);return create(bitmap);}public static BitmapTexture create(Bitmap bitmap) {BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);float[] size = new float[] { bitmap.getWidth(), bitmap.getHeight() };return new BitmapTexture(bitmapShader, size);}public void bind(RuntimeShader shader, String textureName, String sizeName) {shader.setInputShader(textureName, mBitmapShader);shader.setFloatUniform(sizeName, mSize);}
}

        MyRenderer.java

package com.zhyan8.shaderdemo;import android.content.Context;
import android.graphics.RuntimeShader;import com.zhyan8.shaderdemo.graphics.BitmapTexture;
import com.zhyan8.shaderdemo.graphics.ShaderView;
import com.zhyan8.shaderdemo.utils.StringUtils;public class MyRenderer implements ShaderView.Renderer {private Context mContext;private RuntimeShader mShader;private float[] mResolution;private BitmapTexture mBitmapTexture;public MyRenderer(Context context) {this.mContext = context;}@Overridepublic RuntimeShader onSurfaceCreated() {String shaderCode = StringUtils.loadString(mContext, "shaders/jelly.agsl");mShader = new RuntimeShader(shaderCode);mBitmapTexture = BitmapTexture.create(mContext, "textures/photo.png");return mShader;}@Overridepublic void onSurfaceChanged(int width, int height) {mResolution = new float[] { width, height };}@Overridepublic void onDrawFrame(long runTime) {mBitmapTexture.bind(mShader, "u_texture", "u_textureSize");mShader.setFloatUniform("u_resolution", mResolution);mShader.setFloatUniform("u_time", runTime / 1000f);}
}

        jelly.agsl

uniform shader u_texture;
uniform vec2 u_textureSize;
uniform vec2 u_resolution;
uniform float u_time;vec4 texture(vec2 normUV) { // 纹理采样vec2 uv = normUV * u_textureSize;return u_texture.eval(uv);
}vec2 fun(vec2 uv, float aspect) { // 畸变函数vec2 center = vec2(0.5, 0.5 / aspect);vec2 dire = normalize(uv - center);float dist = distance(uv, center);vec2 uv1 = uv + sin(dist * 2.2 + u_time * 3.5) * 0.025;return uv1;
}vec4 main(vec2 coords) {vec2 normUV = coords / u_resolution;float aspect = u_resolution.x / u_resolution.y;normUV.y /= aspect;vec2 uv = fun(normUV, aspect);uv.y *= aspect;return texture(uv);
}

        运行效果如下。

3.2 二次渲染

        本节将对 3.1 节中 MyRenderer 进行修改,使用两个 RuntimeShader 实现二次渲染。

        MyRenderer.java

package com.zhyan8.shaderdemo;import android.content.Context;
import android.graphics.RuntimeShader;import com.zhyan8.shaderdemo.graphics.BitmapTexture;
import com.zhyan8.shaderdemo.graphics.ShaderView;
import com.zhyan8.shaderdemo.utils.StringUtils;public class MyRenderer implements ShaderView.Renderer {private Context mContext;private RuntimeShader mShader1;private RuntimeShader mShader2;private float[] mResolution;private BitmapTexture mBitmapTexture;public MyRenderer(Context context) {this.mContext = context;}@Overridepublic RuntimeShader onSurfaceCreated() {String shaderCode1 = StringUtils.loadString(mContext, "shaders/dispersion.agsl");mShader1 = new RuntimeShader(shaderCode1);String shaderCode2 = StringUtils.loadString(mContext, "shaders/jelly.agsl");mShader2 = new RuntimeShader(shaderCode2);mBitmapTexture = BitmapTexture.create(mContext, "textures/photo.jpg");return mShader2;}@Overridepublic void onSurfaceChanged(int width, int height) {mResolution = new float[] { width, height };}@Overridepublic void onDrawFrame(long runTime) {mBitmapTexture.bind(mShader1, "u_texture", "u_textureSize");mShader1.setFloatUniform("u_resolution", mResolution);mShader1.setFloatUniform("u_time", runTime / 1000f);mShader2.setInputShader("u_texture", mShader1);mShader2.setFloatUniform("u_textureSize", mResolution);mShader2.setFloatUniform("u_resolution", mResolution);mShader2.setFloatUniform("u_time", runTime / 1000f);}
}

        dispersion.agsl

uniform shader u_texture;
uniform vec2 u_textureSize;
uniform vec2 u_resolution;
uniform float u_time;vec4 texture(vec2 normUV) { // 纹理采样vec2 uv = normUV * u_textureSize;return u_texture.eval(uv);
}vec2 getOffset() { // 偏移函数float time = u_time * 1.5;vec2 dire = vec2(sin(time), cos(time));float strength = sin(u_time * 2.0) * 0.01;return dire * strength;
}vec4 main(vec2 coords) {vec2 normUV = coords / u_resolution;vec4 color = texture(normUV);vec2 offset = getOffset();color.r = texture(normUV + offset).r;color.b = texture(normUV - offset).b;return color;
}

        运行效果如下,可以看到叠加了果冻畸变和 RGB 色散效果。


文章转载自:

http://syiEIGI4.xkpjL.cn
http://Lj6yPorn.xkpjL.cn
http://WPXQhAbG.xkpjL.cn
http://8IzGZZvD.xkpjL.cn
http://DtDpeoRL.xkpjL.cn
http://4Xc3DO07.xkpjL.cn
http://AO3221xU.xkpjL.cn
http://3AxDO95y.xkpjL.cn
http://K7WM0JqD.xkpjL.cn
http://swsa6m0B.xkpjL.cn
http://3jZaBZgt.xkpjL.cn
http://hEbs6Uch.xkpjL.cn
http://S0fr2JET.xkpjL.cn
http://gXOmLHPj.xkpjL.cn
http://YfyGA0tY.xkpjL.cn
http://RFOwqtvK.xkpjL.cn
http://asxn58wq.xkpjL.cn
http://c8Zafwro.xkpjL.cn
http://U7gecvZS.xkpjL.cn
http://jsi08X9n.xkpjL.cn
http://QAsrv2Yr.xkpjL.cn
http://HMfiKsn7.xkpjL.cn
http://JMjH9ygr.xkpjL.cn
http://m0KQN1vh.xkpjL.cn
http://QfxbQYDT.xkpjL.cn
http://4SqB7jXR.xkpjL.cn
http://B1muOh3N.xkpjL.cn
http://Ez7GYxdq.xkpjL.cn
http://f8SjI6pX.xkpjL.cn
http://5JJNrL0N.xkpjL.cn
http://www.dtcms.com/wzjs/665028.html

相关文章:

  • 用虚拟机做网站的心得体会seo排名优化是什么意思
  • 阜康市建设银行网站做网站怎么收费的
  • 做外贸网站用什么软件翻强的好的网站具备
  • 广西教育学会 网站建设赤峰建设淘宝网站
  • 阳江网站建设 公司跨境电商入门基础知识
  • 如何做 网站的seowordpress高级搜索
  • 临沂网站制作价格官方网站建站
  • 网站开发 工程师 类型和网站用户体验相关的文章
  • 浙江建设信息港网成绩查询谷歌推广和seo
  • 网站开发技术支持网上自己怎么申请商标注册
  • 网站开发青岛深圳遗像制作
  • mip网站模板校园网络设计方案ensp
  • 做qq图片的网站有哪些公关公司经营范围
  • 工贸一体化企业建设电子商务网站的误区手机提取网页视频下载
  • 自己做的网站如何兼容ie11微信营销ppt
  • 电商网站零售客户成功营销案例
  • 用软件建网站电商培训机构排名前十
  • 阿里巴巴网站运营怎么做本机做wordpress乱码
  • vs2010做网站登陆界面电子商务网站体系结构有哪些
  • wordpress个人下载网站福建建设人才与科技发展中心网站
  • 罗湖医院网站建设动易网站建设工作室
  • 网站推广话术与技巧手游源码论坛
  • 网站建设由几部分构成装修案例英文
  • 呼和浩特商城网站建设永久免费空间免备案
  • 成都html5网站建设wordpress active
  • 福鼎市城市建设监察大队网站上海市中小企业服务平台
  • 中国寰球工程有限公司网站设计企业公示信息查询系统贵州
  • 网站建设企业建站要求网站如何建设与优化
  • 济南网站优化公司杭州公司注册费用
  • 服务好的企业做网站北京黄页电话查询