我刚刚开始使用Direct3D11,我正在尝试创建一个动态纹理,我计划每秒多次使用新数据进行更新.我的问题是每次用新数据更新纹理时,我都会从D3D调试器中得到这个错误:
D3D11:错误:ID3D11DeviceContext :: Map:此资源已经映射![RESOURCE_MANIPULATION错误#2097213:RESOURCE_MAP_ALREADYMAPPED]
在运行应用程序一段时间后,最终会从Map调用变为E_OUTOFMEMORY错误.
我正在创建这样的纹理:
D3D11_TEXTURE2D_DESC td;
td.ArraySize = 1;
td.BindFlags = D3D11_BIND_SHADER_RESOURCE;
td.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
td.Format = DXGI_FORMAT_B8G8R8X8_UNORM;
td.Height = height;
td.Width = width;
td.MipLevels = 1;
td.MiscFlags = 0;
td.SampleDesc.Count = 1;
td.SampleDesc.Quality = 0;
td.Usage = D3D11_USAGE_DYNAMIC;
HR(m_device->CreateTexture2D(&td, 0, &texture));
Run Code Online (Sandbox Code Playgroud)
并更新其数据,如下所示:
HR(m_deviceContext->Map(texture, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource));
BYTE* mappedData = reinterpret_cast<BYTE*>(mappedResource.pData);
for(UINT i = 0; i < height; ++i)
{
memcpy(mappedData, buffer,rowspan);
mappedData += mappedResource.RowPitch;
buffer += rowspan;
}
m_deviceContext->Unmap(texture, 0);
Run Code Online (Sandbox Code Playgroud)
在创建纹理并将数据映射到它之前,我在程序中所做的就是初始化Direct3D设备.我完全被我做错了所困扰.我一直试图在msdn上尽可能多地阅读这篇文章,但没有任何东西可以帮助我弄清楚出了什么问题.根据msdn,我正在采取适当的步骤:
http://msdn.microsoft.com/en-us/library/ff476905(v=vs.85).aspx#Dynamic
To fill a dynamic …Run Code Online (Sandbox Code Playgroud) 我正在使用CUDA Toolkit 4.0在我的Geforce 330M上尝试使用OpenCL-OpenGL互操作.
我想捕获一个帧,将该数据用作Image2DOpenCL内核的输入图像().内核应该操纵数据并将其写入一个Image2DGL具有附加OpenGL纹理的图像对象.基本上它看起来像这样:
_______________ RGB _______________
| | uint8* | | CL_RGBA / CL_UNORM_INT8
| Grabber | ------------> | Image2D | -------------------------.
| avcodec | | [input] | |
|_______________| |_______________| |
|
V
_______________ _______________ _______________
| | | | | |
| Texture | ------------> | Image2DGL | <-----------------> | Kernel |
|_______________| | [output] | |_______________|
|_______________|
Internal
Format: GL_RGBA
Format: GL_RGBA
Type: ?
Run Code Online (Sandbox Code Playgroud)
我正在初始化纹理:
GLuint tex = 0;
void initTexture( …Run Code Online (Sandbox Code Playgroud) 我想用OpenCV检测一个标记,然后我想用OpenGL将它与图像重叠.第一部分是好的(我完美地实现了检测标记),但我对第二部分有一些问题.
标记是:

和图像是:

但结果如下:

生成图像纹理的代码是:
GLuint *textures = new GLuint[2];
glGenTextures(2, textures);
Mat image = imread("Immagine.png");
glBindTexture(GL_TEXTURE_2D, textures[1]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, 4,image.cols, image.rows, 0, GL_RGB,GL_UNSIGNED_BYTE, image.data);
Run Code Online (Sandbox Code Playgroud)
并显示我使用的纹理:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, WIDTH, HEIGHT, 0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glBindTexture(GL_TEXTURE_2D, textures[1]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex2f((GLfloat)(coord[1].x),(GLfloat)(coord[1].y));
glTexCoord2f(1.0f, 0.0f); glVertex2f((GLfloat)(coord[2].x),(GLfloat)(coord[2].y));
glTexCoord2f(1.0f, 1.0f); glVertex2f((GLfloat)(coord[3].x),(GLfloat)(coord[3].y));
glTexCoord2f(0.0f, 1.0f); glVertex2f((GLfloat)(coord[0].x),(GLfloat)(coord[0].y));
glEnd();
Run Code Online (Sandbox Code Playgroud)
我不知道为什么纹理图像是如此奇怪.此外,我使用相同的代码来显示(在opengl窗口上)从网络摄像头捕获的帧,我没有问题.我还注意到,如果我在角落处使用相同的图像没有数字,它可以正常工作(即使它不在标记的相同位置/坐标).
有谁有想法吗?
我有将texture2d保存到文件的问题,它总是给我黑色图像.这是代码:
HRESULT hr = SwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), reinterpret_cast< void** >( &g_pSurface ) );
if( g_pSurface )
{
ID3D11Texture2D* pNewTexture = NULL;
D3D11_TEXTURE2D_DESC description;
g_pSurface->GetDesc( &description );
description.BindFlags = 0;
description.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
description.Usage = D3D11_USAGE_STAGING;
HRESULT hr = d3d11Device->CreateTexture2D( &description, NULL, &pNewTexture );
if( pNewTexture )
{
d3d11DevCon->CopyResource( pNewTexture, g_pSurface );
hr=D3DX11SaveTextureToFileA(d3d11DevCon, pNewTexture, D3DX11_IFF_BMP, "screen.bmp");
return;
}
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我有一个小程序,呈现黄色三角形两次,一次在帧缓冲的左半部分,一次在右侧.
转储纹理

现在,之后我在屏幕上渲染此帧缓冲区的内容.
如果我在framebuffer构造函数中使用GL_TEXTURE_RECTANGLE,它可以工作:
https://github.com/elect86/Joglus/blob/master/Joglolus/src/joglus/example1/FrameBuffer.java
在绑定纹理时,函数renderFullScreenQuad,第372行:
https://github.com/elect86/Joglus/blob/master/Joglolus/src/joglus/example1/GlViewer.java
并在片段着色器中使用sampler2DRect:
#version 330
out vec4 outputColor;
uniform sampler2DRect texture0;
void main() {
outputColor = texture(texture0, gl_FragCoord.xy);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我将所有RECTANGLE更改为2D并且我在fs中使用sample2D,我会在显示结束时获得一个完整的黑色图像(),尽管纹理的转储始终显示正确的图像......我想知道为什么.
我正在尝试使用screencapture并将其保存为jpg格式的文件.我正在关注这个例子.
http://docs.unity3d.com/ScriptReference/Texture2D.EncodeToPNG.html
这是我到目前为止:
string jpgFile = Application.persistentDataPath + "/scrn-1.jpg";
Texture2D tex = new Texture2D (Screen.width, Screen.height);
tex.ReadPixels (new Rect(0, 0, Screen.width, Screen.height), 0, 0);
tex.Apply ();
var bytes = tex.EncodeToJPG();
Destroy (tex);
System.IO.File.WriteAllBytes(jpgFile, bytes);
Run Code Online (Sandbox Code Playgroud)
我发现在iOS上的Unity中运行它给了我:
JPEG参数struct mismatch:库认为大小是372,调用者期望360
但是,如果我将转换更改为tex.EncodeToPNG(); 并将文件名更改为.png一切正常.我不知道如何进行任何援助将不胜感激.谢谢.
您好,我尝试将纹理 2D 转换为图像(并且我无法使用原始图像,因为分辨率在手机中不匹配),但问题是图像没有纹理元素。如何在Image.Sprite中转换UnityEngine.Texture2D。
//Image Profile
protected Texture2D pickedImage;
public Texture2D myTexture2D;
public RawImage getRawImageProfile;
public RawImage getRawImageArrayProfile;
public Image getRawImageProfile2;
public Image getRawImageArrayProfile2;
public void PickImageFromGallery(int maxSize = 256)
{
NativeGallery.GetImageFromGallery((path) =>
{
if( path != null )
{
byte[] imageBytes = File.ReadAllBytes(path);
pickedImage = null;
pickedImage = new Texture2D(2, 2);
pickedImage.LoadImage(imageBytes);
getRawImageProfile.texture = pickedImage;
getRawImageArrayProfile.texture = pickedImage;
getRawImageProfile2.sprite = pickedImage; //ERROR CONVERT SPRITE
//getRawImageArrayProfile2.texture = pickedImage;
}
}, maxSize: maxSize);
byte[] myBytes;
myBytes = pickedImage.EncodeToPNG();
enc = Convert.ToBase64String(myBytes);
}
Run Code Online (Sandbox Code Playgroud) 我想翻转图像并为翻转后的图像创建一个新的Texture2D。
我做了一些研究,发现这段代码将创建一个新的Texture2D;
RenderTarget2D newTarget = new RenderTarget2D(GraphicsDevice, partWidth, partHeight)
GraphicsDevice.SetRenderTarget(newTarget);
SpriteBatch.Draw(original, Vector2.Zero, partSourceRectangle, ... )
GraphicsDevice.SetRenderTarget(null);
Texture2D newTexture = (Texture2D)newTarget;
Run Code Online (Sandbox Code Playgroud)
我知道 newTexture 很容易从内存中删除,因此建议我需要使用 getData/SetData 来创建更永久的纹理。有人可以建议我执行此操作的具体语法吗?
我在一个 Unity 项目中工作,用户选择.bmp用于制作Texture2D并粘贴到模型的图像文件(格式),我创建了下一个代码,我可以正常使用.png和.jpg文件,但是当我尝试加载时,.bmp我得到了只有(我假设)带有红色“?”的默认纹理 符号,所以我认为是图像格式,如何.bmp在运行时使用文件创建纹理?
这是我的代码:
public static Texture2D LoadTexture(string filePath)
{
Texture2D tex = null;
byte[] fileData;
if (File.Exists(filePath))
{
fileData = File.ReadAllBytes(filePath);
tex = new Texture2D(2, 2);
tex.LoadImage(fileData);
}
return tex;
}
Run Code Online (Sandbox Code Playgroud) 我试图调整纹理的大小和宽度及其显示索引超出宽度/高度
纹理需要调整大小,因为我在其他纹理上使用它以应用于特定坐标,所以我无法调整纹理图形的大小是我的 texture2D
graphics.Resize((horizontalx - horizontaly), (verticalx - verticaly), TextureFormat.RGBA32, false);//创建具有高度和宽度的纹理
SetPixels32 只能在 RGBA32 或 BGRA32 纹理上调用,但在 TextureFormat(12) UnityEngine.Texture2D:SetPixels32(Color32[]) 上调用