Files
test/intern/cycles/kernel/osl/globals.h
Lukas Stockner bf412ed9dd Cycles: Support for custom OSL cameras
This allows users to implement arbitrary camera models using OSL by writing
shaders that take an image position as input and compute ray origin and
direction.

The obvious applications for this are e.g. panorama modes, lens distortion
models and realistic lens simulation, but the possibilities are endless.

Currently, this is only supported on devices with OSL support, so CPU and
OptiX. However, it is independent from the shading model used, so custom
cameras can be used without getting the performance hit of OSL shading.

A few samples are provided as Text Editor templates.

One notable current limitation (in addition to the limited device support)
is that inverse mapping is not supported, so Window texture coordinates and
the Vector pass will not work with custom cameras.

Pull Request: https://projects.blender.org/blender/blender/pulls/129495
2025-04-25 19:27:30 +02:00

107 lines
2.3 KiB
C++

/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
*
* SPDX-License-Identifier: Apache-2.0 */
#pragma once
#ifdef WITH_OSL
# include <OSL/oslexec.h>
# include "util/map.h"
# include "util/param.h"
# include "util/vector.h"
# include "kernel/types.h"
# include "kernel/osl/compat.h"
# include "kernel/osl/types.h"
# ifndef WIN32
using std::isfinite;
# endif
CCL_NAMESPACE_BEGIN
class OSLRenderServices;
class ColorSpaceProcessor;
struct ThreadKernelGlobalsCPU;
/* OSL Globals
*
* Data needed by OSL render services, that is global to a rendering session.
* This includes all OSL shaders, name to attribute mapping and texture handles.
*/
struct OSLGlobals {
OSLGlobals()
{
ss = nullptr;
ts = nullptr;
services = nullptr;
use_shading = false;
use_camera = false;
}
bool use_shading;
bool use_camera;
/* shading system */
OSL::ShadingSystem *ss;
OSL::TextureSystem *ts;
OSLRenderServices *services;
/* shader states */
vector<OSL::ShaderGroupRef> surface_state;
vector<OSL::ShaderGroupRef> volume_state;
vector<OSL::ShaderGroupRef> displacement_state;
vector<OSL::ShaderGroupRef> bump_state;
OSL::ShaderGroupRef background_state;
OSL::ShaderGroupRef camera_state;
/* attributes */
using ObjectNameMap = unordered_map<OSLUStringHash, int>;
ObjectNameMap object_name_map;
vector<ustring> object_names;
};
/* trace() call result */
struct OSLTraceData {
Ray ray;
Intersection isect;
ShaderData sd;
bool setup;
bool init;
bool hit;
};
/* thread key for thread specific data lookup */
struct OSLThreadData {
/* Global Data */
OSLGlobals *globals = nullptr;
OSL::ShadingSystem *ss = nullptr;
/* Per-thread data. */
int thread_index = -1;
mutable ShaderGlobals shader_globals;
mutable OSLTraceData tracedata;
OSL::PerThreadInfo *osl_thread_info = nullptr;
OSL::ShadingContext *context = nullptr;
OIIO::TextureSystem::Perthread *oiio_thread_info = nullptr;
OSLThreadData(OSLGlobals *globals, const int thread_index);
~OSLThreadData();
OSLThreadData(OSLThreadData &other) = delete;
OSLThreadData(OSLThreadData &&other) noexcept;
OSLThreadData &operator=(const OSLThreadData &other) = delete;
OSLThreadData &operator=(OSLThreadData &&other) = delete;
};
CCL_NAMESPACE_END
#endif