렌더링 품질을 향상시키기 위해 OpenCL 1.1에서 다목적 분리형 다운 스케일러에 쓰고 있습니다.OpenCL/OpenGL 텍스처 interop/windows 문제
기본 이미지 (최종 이미지의 작은 부분 만 덮음)는 매우 큰 프레임 버퍼로 렌더링됩니다. 그런 다음 색상으로 연결된 텍스처가 다운 샘플링되어 OpenCL을 통해 다른 텍스처에 배치됩니다. 마지막으로 화면에 정렬 된 쿼드가 렌더링되어 결과를 표시합니다.
지금까지의 아이디어. 우리가 할 일 : downscaler 커널의
- 2 인스턴스 (좌표 교환과 결과를 저장한다 (예로서 (Y, X))
- inputTexture RTT를-프레임 버퍼의 (색 첨부)
- tempTexture 크기 : inputHeight X outputWidth, CL_MEM_READ_WRITE로 작성된
kernel_instance_1(<otherParams>, inputTexture, tempTexture)
실행 - outputTexture
가 생성 원하는 결과 하지만 만에 VE를 첫 번째 프레임 - 어떻게 든 애니메이션에서 일어나는 변화가 전혀 나타나지 않습니다. 오류가 없으므로 (아래 참조) 커널이 모든 프레임을 실행한다고 가정하지만 원본 텍스처 내용은 동일하게 유지됩니다 (그렇지 않은 경우 해당 텍스처의 라이브 출력도 있음).
Question:
프레임 버퍼의 내용이 변경 될 때마다 clCreateFromGLTexture2D()를 호출해야합니까?
편집이 난 그냥 깨달았다 다음 inputTexture 여전히에 부착 된 프레임 버퍼 오브젝트의 GL_COLOR_ATTACHMENT0
-이 문제가 될 수있다? endedit
kernel_instance_2(<otherParams>, tempTexture, outputTexture)
을 실행하면 두 커널 호출간에 대기열이있는 경우에도 눈에 띄는 결과가 없습니다. 나는. outputTexture는 비어 있습니다. OpenCL을 변경 사항을 볼 수 있도록
Question:
tempTexture
을 다시 취득해야합니까?
다만, 다음과 같은 출력이 생성 있었는지 OpenCL을-호출을 만들어 볼 수 있습니다 : 모든 통화에 오류가 발생했다면
clCreateKernel(separable_X)
clRetainMemObject(separable_X::convolution)
clCreateKernel(separable_Y)
clRetainMemObject(separable_Y::convolution)
clCreateFromGLTexture2D(separable_X::dst + separable_y::src, texID=24, usage=temporary (source and target))
clCreateFromGLTexture2D(separable_Y::dst, texID=18, usage=target)
clCreateFromGLTexture2D(separable_X::src, texID=22, usage=source)
clRetainMemObject(separable_X::dst)
clRetainMemObject(separable_Y::src)
clRetainMemObject(separable_Y::dst)
clRetainMemObject(clearEmpty::dst)
clEnqueueAcquireGLObjects(count=3)
clEnqueueBarrier()
clSetKernelArg(separable_X::convert)
clSetKernelArg(separable_X::offset)
clSetKernelArg(separable_X::convolution)
clSetKernelArg(separable_X::dst)
clSetKernelArg(separable_X::src)
clEnqueueNDRangeKernel(separable_X, (1440, 1080, 0), waiting4 0 events)
clSetKernelArg(separable_Y::convert)
clSetKernelArg(separable_Y::offset)
clEnqueueBarrier()
clSetKernelArg(separable_Y::convolution)
clSetKernelArg(separable_Y::dst)
clSetKernelArg(separable_Y::src)
clEnqueueNDRangeKernel(separable_Y, (540, 1440, 0), waiting4 0 events)
clEnqueueBarrier()
clEnqueueReleaseGLObjects(count=3)
는, 그 출력의 내부에 있었던 것이다.
많은 시간이 걸리는 또 다른 상황은 clEnqueueReleaseGLObjects()
이 누군가 "NVidia : 불법 읽기 또는 버퍼 쓰기"로 제출 한 오류 코드 -9999를 반환한다는 것입니다.
Question:
write_imagef()
의 색상 값을 고정하지 않는 것이 될 수 있을까? 그래서 그것은 실제로 하나를 써야한다는 것을 의미합니다 ...
write_imagef(texture, (int2)coord, clamp(color, 0.f, 1.f));
...
미리 감사드립니다. 이것은 거의 일주일이 지난 후 저의 머리를 두 드렸습니다.
편집 언급 할 가치가있을 수도 있습니다 좀 더 정보를 정기적으로 :
나는 두 개의 인스턴스를 구별 할 수있는 방법을?
는 모두 separable()
α- 함수를 호출 동일한 바디를 프로그램 소스 안에 다른 이름 (separable_X
및 separable_Y
) 2 개 고유 함수 __kernel
있다.
어떻게 GL과 CL을 동기화합니까?
는 - GL을 획득 돌보는 기능이 clEnqueueAcquireGLObjects()
호출하기 전에 발행 glFinish()
객체 - 나는 당신이 clEnqueueAcquireGLObjects 전에 glFinish를 사용하고 (향후 변경 가능성) cl_events
어떻게 OpenGL과 OpenCL을 동기화하고 있습니까? –
@RetoKoradi 제 편집을 참조하십시오. – St0fF
Q : 프레임 버퍼의 내용이 변경 될 때마다 clCreateFromGLTexture2D()를 호출해야합니까? A : 아니요, OpenGL 텍스처에서 OpenCL 이미지를 만들 때 한 번만 수행 할 수 있습니다. 루프가 사용되기 전에 그렇게해야합니다. Q : 두 커널 호출 사이에서 텍스처 개체 tempTexture를 해제하고 다시 가져와야합니까? OpenCL에서 변경 내용을 볼 수 있습니까? A : 아니요. 일단 OpenCL 용으로 구입하면 필요한만큼 사용할 수 있습니다. – Dithermaster