forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Программирование для мобильных устройств (http://forum.boolean.name/forumdisplay.php?f=173)
-   -   [Android] PowerVR и GUI-текстура (http://forum.boolean.name/showthread.php?t=19167)

Кирпи4 13.05.2014 00:54

[Android] PowerVR и GUI-текстура
 
Привет, булка. Я тоже принял веру юнитиведения, и потихоньку начал портировать Horizon Prime на него. Но на андроиде (плашка Galaxy Tab 2 7") возникла странная проблема.

Имею картинку (PNG, RGBA 32bpp):


Импортирую текстуру со следующими настройками:


Вывожу её кодом:
Код:

GUI.DrawTextureWithTexCoords(new Rect((scrW-512.0f)*mul,0, 512.0f*mul, 256.0f*mul), UIMaterials[2], new Rect(0,1,1,-1), true);
Результат:


Появляется странный глюк с такими вот квадратами, которые постоянно меняют своё местоположение (картинка так и должна быть перевёрнута и заскейлена). Хотя в то же время в плеймоде всё работает как надо (как и в пека-билде).

ЧЯДНТ?

Arton 13.05.2014 01:26

Ответ: [Android] PowerVR и GUI-текстура
 
Цитата:

Сообщение от Кирпи4 (Сообщение 280587)
Я тоже принял веру юнитиведения, и потихоньку начал портировать Horizon Prime на него.

Всё, Игоря не дождёмся!

Кирпи4 13.05.2014 01:29

Ответ: [Android] PowerVR и GUI-текстура
 
Цитата:

Сообщение от Arton (Сообщение 280599)

Всё, Игоря не дождёмся!

Дождётесь, даже на портативных девайсах


Плавно подхожу к причине. Если в GUI.DrawTexture() вырубить alphaBlend, артефакт исчезает

Кирпи4 13.05.2014 02:45

Ответ: [Android] PowerVR и GUI-текстура
 
Базарю - проблема оказалась гораздо глубже: в шейдере чанков. Артефакты начинаются только там, где пиксели интерфейса пересекают пиксели чанков. Правда вот беда - не знаю как исправить шейдер. Пишет что количество временных регистров 8 превышено, требуется 9 регистров (в районе 10 линии). Вот листинг шейдера:

Код:

Shader "Custom/Terrain" {
        Properties {
                _GrassTex ("Grass (RGB)", 2D) = "white" {}
                _MidTex ("Middle (RGB)", 2D) = "white" {}
                _RockTex ("Rock (RGB)", 2D) = "white" {}
        }
        SubShader {
                Tags { "RenderType"="Opaque" }
                LOD 200
               
                CGPROGRAM
                #pragma surface surf Lambert

                sampler2D _GrassTex;
                sampler2D _MidTex;
                sampler2D _RockTex;

                struct Input {
                        float2 uv_GrassTex;
                        float2 uv_MidTex;
                        float2 uv_RockTex;
                       
                        float3 worldPos;
                };
               
               
                void surf (Input IN, inout SurfaceOutput o) {
                        float delta;
                        float hght = (IN.worldPos.y+1.5)/3.0;
                        if(hght>0.7){
                                delta = (clamp(hght,0.7,1.0)-0.7)/0.2;
                                o.Albedo = (tex2D(_RockTex,IN.uv_RockTex)*delta + tex2D(_MidTex,IN.uv_MidTex)*(1.0-delta)).rgb;
                        }else if(hght<0.2){
                                delta = clamp(hght,0.0,0.2)/0.2;
                                o.Albedo = (tex2D(_MidTex,IN.uv_MidTex)*delta + tex2D(_GrassTex,IN.uv_GrassTex)*(1.0-delta)).rgb;
                        }else{
                                o.Albedo = (tex2D(_MidTex,IN.uv_MidTex)).rgb;
                        }
                        o.Alpha = 1.0;
                }
                ENDCG
        }
        FallBack "Mobile/Diffuse"
}


pax 13.05.2014 07:29

Ответ: [Android] PowerVR и GUI-текстура
 
Оптимизируй структуру Input примерно так:
PHP код:

Shader "Custom/Terrain" {
    
Properties {
        
_GrassTex ("Grass (RGB)"2D) = "white" {}
        
_MidTex ("Middle (RGB)"2D) = "white" {}
        
_RockTex ("Rock (RGB)"2D) = "white" {}
    }
    
SubShader {
        
Tags "RenderType"="Opaque" }
        
LOD 200
        
        CGPROGRAM
        
#pragma surface surf Lambert

        
sampler2D _GrassTex;
        
sampler2D _MidTex;
        
sampler2D _RockTex;

        
struct Input {
            
float2 uv_MidTex;
            
            
float3 worldPos;
        };
        
        
        
void surf (Input INinout SurfaceOutput o) {
            
float delta;
            
float hght = (IN.worldPos.y+1.5)/3.0;
            if(
hght>0.7){
                
delta = (clamp(hght,0.7,1.0)-0.7)/0.2;
                
o.Albedo = (tex2D(_RockTex,IN.uv_MidTex)*delta tex2D(_MidTex,IN.uv_MidTex)*(1.0-delta)).rgb;
            }else if(
hght<0.2){
                
delta clamp(hght,0.0,0.2)/0.2;
                
o.Albedo = (tex2D(_MidTex,IN.uv_MidTex)*delta tex2D(_GrassTex,IN.uv_MidTex)*(1.0-delta)).rgb;
            }else{
                
o.Albedo = (tex2D(_MidTex,IN.uv_MidTex)).rgb;
            }
            
o.Alpha 1.0;
        }
        
ENDCG
    

    
FallBack "Mobile/Diffuse"


По поводу проблем с текстурой GUI: попробуй перед отрисовкой очистить буфер глубины http://docs.unity3d.com/Documentatio.../GL.Clear.html

Кирпи4 13.05.2014 20:27

Ответ: [Android] PowerVR и GUI-текстура
 
Цитата:

Сообщение от pax (Сообщение 280617)
Оптимизируй структуру Input примерно так:

Заменил, всё равно ругается.

Цитата:

Сообщение от pax (Сообщение 280617)
По поводу проблем с текстурой GUI: попробуй перед отрисовкой очистить буфер глубины http://docs.unity3d.com/Documentatio.../GL.Clear.html

Очищал, не помогает, артефакт остаётся. Глюк пропадает, если рисовать через Graphics.DrawTexture вместо GUI.DrawTexture. Есть ли какие-то подводные камни у такого метода?


Часовой пояс GMT +4, время: 00:03.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot