追記依頼欄で申し上げたようにDirect3Dのことに疎いため、認識が間違っているかもしれませんのでご注意願います。
まずRGBの狂いについてはフォーマットの違いということで説明できそうですね。D3DFORMAT (D3D9Types.h) - Win32 apps | Microsoft Docs によると...
All formats are listed from left to right, most-significant bit to least-significant bit. For example, D3DFORMAT_ARGB is ordered from the most-significant bit channel A (alpha), to the least-significant bit channel B (blue). When traversing surface data, the data is stored in memory from least-significant bit to most-significant bit, which means that the channel order in memory is from least-significant bit (blue) to most-significant bit (alpha).
とのことで、D3DFMT_X8R8G8B8
ならばメモリ上のデータは「B G R X B G R X ...」となっているはずであり、データのサイズとRGBの並びがTextureFormat.BGRA32 と同じになっていると言えそうです。
同じくリファレンスのUnsigned Formats の節によると、D3DFMT_X8R8G8B8
は
32-bit RGB pixel format, where 8 bits are reserved for each color.
とのことでした。「X8」の8ビットについては何か意味のある役割があるのか、0で埋められているのか、あるいはどんな値が入っているかは不定なのか...といったことは、すみませんが知識不足につきわかりませんでした(まあ、多分使っていないんでしょう)。
データをTextureFormat.BGRA32
形式のテクスチャに詰めた場合、この8ビットのXはアルファチャンネルと見なされるはずです。
ご質問者さんが「現在RawImageのマテリアルに反映させていますがテクスチャに反映しようと試みてみもうまくいきません」とおっしゃる現象のうち、「テクスチャに反映」の方...つまりthis.img.texture = this.texRGBA;
を試したときの状況についてうかがいますが、もしかしてこのときにはRaw Imageのマテリアルを「None」にしていたんじゃないでしょうか?
仮にそうだとすれば、テクスチャは半透明に対応したデフォルトのシェーダーでレンダリングされるはずですから、Xが0ならピクセルは消えてしまうでしょうし、変な値が入っていればそれに応じて半透明に見えるでしょう。
また「現在RawImageのマテリアルに反映させていますが」のときのマテリアルでは、「Unlit/Texture」のようなアルファチャンネルを使用しないタイプのシェーダーを使っていたのではないでしょうか?
そうであれば、マテリアルにテクスチャをセットしたときにはアルファチャンネルが無視されてうまく描画された...と説明できそうです。
上記のような心当たりがありましたら、Raw Imageのマテリアルとして最初から「現在RawImageのマテリアルに反映させていますが」のときのマテリアルをセットしておけばthis.img.texture = this.texRGBA;
でもうまく描画されるんじゃないかと思います(ちなみに、テクスチャオブジェクト自体を生成しなおしたりはせず中身のデータを更新するだけであれば、最初に一度だけthis.img.texture = this.texRGBA;
でテクスチャをセットしてやれば十分なはずです)。
それだとマスクだとかが効かなくて困る...といった事情がありましたら、組み込みのUI用シェーダーをベースに下記のようなアルファチャンネルを強制的に1にしてしまうマテリアルを作るのがいいかと思います。
ShaderLab
1 // Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)
2
3 Shader "UI/IgnoreAlpha"
4 {
5 Properties
6 {
7 [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
8 _Color ("Tint", Color) = (1,1,1,1)
9 _StencilComp ("Stencil Comparison", Float) = 8
10 _Stencil ("Stencil ID", Float) = 0
11 _StencilOp ("Stencil Operation", Float) = 0
12 _StencilWriteMask ("Stencil Write Mask", Float) = 255
13 _StencilReadMask ("Stencil Read Mask", Float) = 255
14 _ColorMask ("Color Mask", Float) = 15
15 }
16
17 SubShader
18 {
19 Tags
20 {
21 "Queue"="Transparent"
22 "IgnoreProjector"="True"
23 "RenderType"="Transparent"
24 "PreviewType"="Plane"
25 "CanUseSpriteAtlas"="True"
26 }
27
28 Stencil
29 {
30 Ref [_Stencil]
31 Comp [_StencilComp]
32 Pass [_StencilOp]
33 ReadMask [_StencilReadMask]
34 WriteMask [_StencilWriteMask]
35 }
36
37 Cull Off
38 Lighting Off
39 ZWrite Off
40 ZTest [unity_GUIZTestMode]
41 Blend One Zero
42 ColorMask [_ColorMask]
43
44 Pass
45 {
46 Name "Default"
47 CGPROGRAM
48 #pragma vertex vert
49 #pragma fragment frag
50 #pragma target 2.0
51
52 #include "UnityCG.cginc"
53 #include "UnityUI.cginc"
54
55 #pragma multi_compile_local _ UNITY_UI_CLIP_RECT
56
57 struct appdata_t
58 {
59 float4 vertex : POSITION;
60 float4 color : COLOR;
61 float2 texcoord : TEXCOORD0;
62 UNITY_VERTEX_INPUT_INSTANCE_ID
63 };
64
65 struct v2f
66 {
67 float4 vertex : SV_POSITION;
68 fixed4 color : COLOR;
69 float2 texcoord : TEXCOORD0;
70 float4 worldPosition : TEXCOORD1;
71 half4 mask : TEXCOORD2;
72 UNITY_VERTEX_OUTPUT_STEREO
73 };
74
75 sampler2D _MainTex;
76 fixed4 _Color;
77 fixed4 _TextureSampleAdd;
78 float4 _ClipRect;
79 float4 _MainTex_ST;
80 float _MaskSoftnessX;
81 float _MaskSoftnessY;
82
83 v2f vert(appdata_t v)
84 {
85 v2f OUT;
86 UNITY_SETUP_INSTANCE_ID(v);
87 UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
88 float4 vPosition = UnityObjectToClipPos(v.vertex);
89 OUT.worldPosition = v.vertex;
90 OUT.vertex = vPosition;
91 float2 pixelSize = vPosition.w;
92 pixelSize /= float2(1, 1) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));
93 float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
94 float2 maskUV = (v.vertex.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy);
95 OUT.texcoord = float4(v.texcoord.x, v.texcoord.y, maskUV.x, maskUV.y);
96 OUT.mask = half4(v.vertex.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + abs(pixelSize.xy)));
97 OUT.color = v.color * _Color;
98 return OUT;
99 }
100
101 fixed4 frag(v2f IN) : SV_Target
102 {
103 half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color;
104 color.a = 1.0;
105 #ifdef UNITY_UI_CLIP_RECT
106 half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(IN.mask.xy)) * IN.mask.zw);
107 color.a *= m.x * m.y;
108 #endif
109 clip(color.a - 0.5);
110
111 return color;
112 }
113 ENDCG
114 }
115 }
116 }
テクスチャの上下が逆転してしまう件については、Tilingの設定で問題なければそれでかまわないと思います。おそらく座標系の違いに起因するのでしょう。
Texture Coordinates (Direct3D 9) - Win32 apps | Microsoft Docs の図を見ますに、Direct3Dでは原点が左上なんでしょうね。プラットフォーム特有のレンダリングの違い - Unity マニュアル にも環境による差異や、それを吸収するための考慮事項が載っていました。