我正在尝试使用像素着色器和两个纹理创建一个tile引擎.一个纹理将保持tileset,一个将保存地图.
是否可以将纹理数据作为实际(非采样)数据读取,以便从地图中提取索引?
读取像素数据的最佳方法是什么?
我只尝试过text2D,但是还有一些不足之处(说实话,我对像素着色器有点新意).
基本上,我需要一种方法来从地图纹理中的特定像素读取实际数据,并将其用作切片纹理的整数索引.假设我已经设法创建并将适当的纹理传递给着色器.
有什么想法吗?
(使用monogame for metro所以dx等级9_1)
我有一个工作代码,我从纹理缓冲区中读取着色器中的vec4值.
在客户端,我创建了一个位移矢量缓冲区:
vec4 vector1 : vec4(x1, y1, z1, w1);
vec4 vector2 : vec4(x2, y2, z2, w2);
vec4 vector3 : vec4(x3, y3, z3, w3);
..
Run Code Online (Sandbox Code Playgroud)
然后我创建一个包含vector1,vector2,vector3的顶点缓冲区....
接下来,我创建一个纹理并使用以下方法将上面的缓冲区绑定到它:
glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, bufferID);
Run Code Online (Sandbox Code Playgroud)
我之所以选择GL_RGBA32F,是因为x1,y1,z1,w1等都是浮点数.
在着色器中我可以使用以下方法获取单个向量:
vec4 vector1 = texelFetch(samplerObj, 0);
vec4 vector2 = texelFetch(samplerObj, 1);
.
.
Run Code Online (Sandbox Code Playgroud)
但是,现在假设我的位移矢量不是vec4,而是一个整数.即
int vector1 = x1; //(int is 32 bit unsigned)
int vector2 = x2; //(int is 32 bit unsigned)
Run Code Online (Sandbox Code Playgroud)
有人可以告诉相应的internalFormat会是什么?是吗
glTexBuffer(GL_TEXTURE_BUFFER, GL_R32UI, bufferID);
Run Code Online (Sandbox Code Playgroud)
我还将如何在着色器中使用texelFetch获取值?是吗
int vector1 = texelFetch(samplerObj, 0);
Run Code Online (Sandbox Code Playgroud)
要么
int vector1 = texelFetch(samplerObj, 0).r ?
Run Code Online (Sandbox Code Playgroud)
我很困惑,因为texelFetch应该返回一个有4个组件的纹素,所以我必须使用结果的红色组件吗?
我正在研究一个项目,对于那个项目,我不得不浏览一本名为"OpenGL ES 2 For Android:快速入门指南"的书.所以当我进行纹理处理时,我得到的错误是:
'texture2D' : No matching overloaded function found
Run Code Online (Sandbox Code Playgroud)
当我编译着色器时.着色器代码:
// Fragment shader
precision mediump float;
uniform sampler2D u_TextureUnit;
varying vec4 v_TextureCoordinates;
void main()
{
gl_FragColor = texture2D(u_TextureUnit, v_TextureCoordinates);
}
// Vertex shader
uniform mat4 u_Matrix;
attribute vec4 a_Position;
attribute vec4 a_TextureCoordinates;
varying vec4 v_TextureCoordinates;
void main()
{
gl_Position = u_Matrix * a_Position;
v_TextureCoordinates = a_TextureCoordinates;
}
Run Code Online (Sandbox Code Playgroud)
我为我的项目尝试了相同的着色器以及与书中完全相同的代码但是当我编译着色器时它仍然给我相同的错误,并且android设备上的视口是空白的,只是我设置的清晰颜色显示.
我正在模型的多个网格上渲染不同的纹理,但我没有太多关于这些过程的线索.有人为每个网格建议,创建自己的描述符集并调用vkCmdBindDescriptorSets()和vkCmdDrawIndexed()进行渲染,如下所示:
// Pipeline with descriptor set layout that matches the shared descriptor sets
vkCmdBindPipeline(...pipelines.mesh...);
...
// Mesh A
vkCmdBindDescriptorSets(...&meshA.descriptorSet... );
vkCmdDrawIndexed(...);
// Mesh B
vkCmdBindDescriptorSets(...&meshB.descriptorSet... );
vkCmdDrawIndexed(...);
Run Code Online (Sandbox Code Playgroud)
然而,上述方法与切碎机样品和vulkan的样品有很大不同,这使得我不知道从哪里开始改变.我非常感谢任何帮助,指导我找到正确的方向.
干杯
我是XNA的新手以防万一.我尝试做的是加载与原版不同尺寸的纹理,或者至少有可能在之后改变尺寸.我在某些地方看到我可以使用:
Texture2D.FromStream(GraphicsDevice graphicsDevice, Stream stream,
int width, int height, bool zoom)
Run Code Online (Sandbox Code Playgroud)
但我也读到以这种方式加载纹理忽略了ContentManager,而且我为垃圾收集器做的工作更加困难.
使用ContentManager以任何大小加载图像的正确方法是什么?如果那是不可能的,我可以按比例改变他的大小,比如使用缩放吗?
背景:我正在建立一个nxn和平委员会.当n太大时我自动需要和平变得更小.
我有一个使用初始化的CCSprite [CCSprite spriteWithSpriteFrameName:@"plist_file_key_here.png"].我已经将plist文件中的所有sprite添加到CCSpriteFrameCache中.我试过像这样设置纹理:
CCSpriteFrame * frame = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:name];
NSAssert(frame.texture!=nil, @"frame.texture can't equal nil"); //this works fine
[sprite setTexture:frame.texture]; //doesn't cause a white square to appear, just doesn't switch the image.
Run Code Online (Sandbox Code Playgroud)
正如我在评论中所说,这不起作用.我认为它与using [CCSprite spriteWithFile:]和之间的区别有关[CCSprite spriteWithSpriteFrameName:],它依赖于从纹理图集加载到CCSpriteFrameCache中的精灵帧.当使用从纹理图集加载的精灵时,每个精灵的纹理等于精灵图纸的纹理.有没有办法解决这个问题,还是我必须删除并重新创建精灵?如果这是我唯一的选择,有没有办法从其父节点删除ccnode但保留其子节点?
我正在使用XNA中的一个项目,我正在使用一些相当大的纹理,我将其作为Texture2D对象加载到游戏中,并且在屏幕上绘制的内容比它们加载的要小得多.原因是我需要在不同的地方以各种不同的尺寸绘制它们,虽然我可以用多个纹理来做这个,但这样做是不切实际的.
我的问题是,在缩小它们时,XNA似乎不会对这些Texture2D对象进行抗锯齿处理.我已经设定:
graphics.PreferMultiSampling = true;
Run Code Online (Sandbox Code Playgroud)
并且
spriteBatch.Begin(SpriteBlendMode.AlphaBlend);
Run Code Online (Sandbox Code Playgroud)
但无济于事.我也尝试过各种涉及GraphicsDevice过滤器的东西,但老实说,我并不知道自己在做什么.
显然,我正在使用spriteBatch绘制它,但除此之外,我绘制它的方式没什么特别有趣的.
这是一个(放大的)例子,说明正在发生的事情,以及我正在努力实现的目标:

如您所见,XNA在重新缩放图像时不提供任何抗锯齿功能.有没有办法可以强制它这样做,以使边缘看起来更干净?
GL_TEXTURE0(插槽0上的纹理)之后的每个纹理都是黑色.
片段着色器(通过更改权重来检查不同纹理的示例代码):
#version 330
uniform sampler2D g_ColorTex;
uniform sampler2D g_DepthTex;
uniform sampler2D g_DofNearBlurTex;
uniform sampler2D g_DofDownBlurTex;
in vec4 g_VertexPosition;
in vec2 g_ScreenCoords;
layout (location = 0) out vec4 FragColor;
void main()
{
// Changing weights to check textures
FragColor = 1.00001f * vec4(texture(g_ColorTex , g_ScreenCoords).rgb, 1.0f);
FragColor += 0.00001f * vec4(texture(g_DepthTex , g_ScreenCoords).rgb, 1.0f);
FragColor += 0.00001f * vec4(texture(g_DofNearBlurTex, g_ScreenCoords).rgb, 1.0f);
FragColor += 0.00001f * vec4(texture(g_DofDownBlurTex, g_ScreenCoords).rgb, 1.0f);
}
Run Code Online (Sandbox Code Playgroud)
我上传这样的纹理(摘录!):
::glUseProgram(ShaderHandle);
unsigned int TextureIndex;
TextureIndex = ::glGetUniformLocation(ShaderHandle, "g_ColorTex");
::glUniform1i(TextureIndex, 0); …Run Code Online (Sandbox Code Playgroud) 我较早提出了类似的问题,但是并没有很好地阐明它们,现在我想提一个建议,我在代码中做错了什么。
所以我想做的是将SurfaceTexture从Android插件渲染到Unity Texture2D。
public class AndroidHandler : MonoBehaviour {
[SerializeField]
private RawImage _rawImage;
private Texture2D _inputTexture;
private AndroidJavaObject androidStreamerObj;
private System.IntPtr _nativePtr;
void Start () {
_rawImage.material.SetTextureScale("_MainTex", new Vector2(-1, -1));
InitAndroidStreamerObject();
}
private void InitAndroidStreamerObject()
{
androidStreamerObj = new AndroidJavaObject("makeitbetter.figazzz.com.vitamiousing7.AndroidStreamer");
Int32 texPtr = androidStreamerObj.Call <Int32> ("GetTexturePtr");
Debug.Log("texture pointer? " + texPtr);
Texture2D nativeTexture = Texture2D.CreateExternalTexture (128, 128, TextureFormat.RGBA32 , false, false, new System.IntPtr(texPtr));
_rawImage.texture = nativeTexture;
}
public void StartStream()
{
string streamLink = "rtmp://live.hkstv.hk.lxdns.com/live/hks"; //"rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov"; //"rtmp://live.hkstv.hk.lxdns.com/live/hks";
androidStreamerObj.Call("LaunchStream", streamLink); …Run Code Online (Sandbox Code Playgroud) 我正在使用 DirectX 来绘制视频。通过Intel Media SDK解码后。然后我通过以下英特尔代码绘制它:
mfxStatus CD3D11Device::RenderFrame(mfxFrameSurface1 * pSrf, mfxFrameAllocator * pAlloc)
{
HRESULT hres = S_OK;
mfxStatus sts;
sts = CreateVideoProcessor(pSrf);
MSDK_CHECK_STATUS(sts, "CreateVideoProcessor failed");
hres = m_pSwapChain->GetBuffer(0, __uuidof( ID3D11Texture2D ), (void**)&m_pDXGIBackBuffer.p);
if (FAILED(hres))
return MFX_ERR_DEVICE_FAILED;
D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC OutputViewDesc;
if (2 == m_nViews)
{
m_pVideoContext->VideoProcessorSetStreamStereoFormat(m_pVideoProcessor, 0, TRUE,D3D11_VIDEO_PROCESSOR_STEREO_FORMAT_SEPARATE,
TRUE, TRUE, D3D11_VIDEO_PROCESSOR_STEREO_FLIP_NONE, NULL);
m_pVideoContext->VideoProcessorSetOutputStereoMode(m_pVideoProcessor,TRUE);
OutputViewDesc.ViewDimension = D3D11_VPOV_DIMENSION_TEXTURE2DARRAY;
OutputViewDesc.Texture2DArray.ArraySize = 2;
OutputViewDesc.Texture2DArray.MipSlice = 0;
OutputViewDesc.Texture2DArray.FirstArraySlice = 0;
}
else
{
OutputViewDesc.ViewDimension = D3D11_VPOV_DIMENSION_TEXTURE2D;
OutputViewDesc.Texture2D.MipSlice = 0;
}
if (1 == m_nViews || 0 == …Run Code Online (Sandbox Code Playgroud) texture2d ×10
c# ×3
android ×2
opengl ×2
opengl-es ×2
xna ×2
antialiasing ×1
ccsprite ×1
directx-11 ×1
downsize ×1
glsl ×1
java ×1
pixel-shader ×1
rgb ×1
textures ×1
tile-engine ×1
vulkan ×1
xbox ×1
yuv ×1